0);
$sql_where = '';
}
else
{
$sql_where = 'left_id > ' . $root_data['left_id'] . ' AND left_id < ' . $root_data['right_id'];
}
// Handle marking everything read
if ($mark_read == 'all')
{
$redirect = build_url(array('mark', 'hash', 'mark_time'));
meta_refresh(3, $redirect);
if (check_link_hash(request_var('hash', ''), 'global'))
{
markread('all', false, false, request_var('mark_time', 0));
if ($request->is_ajax())
{
// Tell the ajax script what language vars and URL need to be replaced
$data = array(
'NO_UNREAD_POSTS' => $user->lang['NO_UNREAD_POSTS'],
'UNREAD_POSTS' => $user->lang['UNREAD_POSTS'],
'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&mark=forums&mark_time=' . time()) : '',
'MESSAGE_TITLE' => $user->lang['INFORMATION'],
'MESSAGE_TEXT' => $user->lang['FORUMS_MARKED']
);
$json_response = new phpbb_json_response();
$json_response->send($data);
}
trigger_error(
$user->lang['FORUMS_MARKED'] . '
' .
sprintf($user->lang['RETURN_INDEX'], '', '')
);
}
else
{
trigger_error(sprintf($user->lang['RETURN_PAGE'], '', ''));
}
}
// Display list of active topics for this category?
$show_active = (isset($root_data['forum_flags']) && ($root_data['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS)) ? true : false;
$sql_array = array(
'SELECT' => 'f.*',
'FROM' => array(
FORUMS_TABLE => 'f'
),
'LEFT_JOIN' => array(),
);
if ($config['load_db_lastread'] && $user->data['is_registered'])
{
$sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id');
$sql_array['SELECT'] .= ', ft.mark_time';
}
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
$tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, phpbb_request_interface::COOKIE);
$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
if (!$user->data['is_registered'])
{
$user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
}
}
if ($show_active)
{
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(FORUMS_ACCESS_TABLE => 'fa'),
'ON' => "fa.forum_id = f.forum_id AND fa.session_id = '" . $db->sql_escape($user->session_id) . "'"
);
$sql_array['SELECT'] .= ', fa.user_id';
}
$sql_ary = array(
'SELECT' => $sql_array['SELECT'],
'FROM' => $sql_array['FROM'],
'LEFT_JOIN' => $sql_array['LEFT_JOIN'],
'WHERE' => $sql_where,
'ORDER_BY' => 'f.left_id',
);
/**
* Event to modify the SQL query before the forum data is queried
*
* @event core.display_forums_modify_sql
* @var array sql_ary The SQL array to get the data of the forums
* @since 3.1-A1
*/
$vars = array('sql_ary');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_sql', compact($vars)));
$sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql);
$forum_tracking_info = array();
$branch_root_id = $root_data['forum_id'];
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
while ($row = $db->sql_fetchrow($result))
{
/**
* Event to modify the data set of a forum
*
* This event is triggered once per forum
*
* @event core.display_forums_modify_row
* @var int branch_root_id Last top-level forum
* @var array row The data of the forum
* @since 3.1-A1
*/
$vars = array('branch_root_id', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_row', compact($vars)));
$forum_id = $row['forum_id'];
// Mark forums read?
if ($mark_read == 'forums')
{
if ($auth->acl_get('f_list', $forum_id))
{
$forum_ids[] = $forum_id;
}
continue;
}
// Category with no members
if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
{
continue;
}
// Skip branch
if (isset($right_id))
{
if ($row['left_id'] < $right_id)
{
continue;
}
unset($right_id);
}
if (!$auth->acl_get('f_list', $forum_id))
{
// if the user does not have permissions to list this forum, skip everything until next branch
$right_id = $row['right_id'];
continue;
}
if ($config['load_db_lastread'] && $user->data['is_registered'])
{
$forum_tracking_info[$forum_id] = (!empty($row['mark_time'])) ? $row['mark_time'] : $user->data['user_lastmark'];
}
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
if (!$user->data['is_registered'])
{
$user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
}
$forum_tracking_info[$forum_id] = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark'];
}
// Count the difference of real to public topics, so we can display an information to moderators
$row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && $row['forum_topics_unapproved']) ? $forum_id : 0;
$row['forum_posts'] = $phpbb_content_visibility->get_count('forum_posts', $row, $forum_id);
$row['forum_topics'] = $phpbb_content_visibility->get_count('forum_topics', $row, $forum_id);
// Display active topics from this forum?
if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS))
{
if (!isset($active_forum_ary['forum_topics']))
{
$active_forum_ary['forum_topics'] = 0;
}
if (!isset($active_forum_ary['forum_posts']))
{
$active_forum_ary['forum_posts'] = 0;
}
$active_forum_ary['forum_id'][] = $forum_id;
$active_forum_ary['enable_icons'][] = $row['enable_icons'];
$active_forum_ary['forum_topics'] += $row['forum_topics'];
$active_forum_ary['forum_posts'] += $row['forum_posts'];
// If this is a passworded forum we do not show active topics from it if the user is not authorised to view it...
if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
{
$active_forum_ary['exclude_forum_id'][] = $forum_id;
}
}
//
if ($row['parent_id'] == $root_data['forum_id'] || $row['parent_id'] == $branch_root_id)
{
if ($row['forum_type'] != FORUM_CAT)
{
$forum_ids_moderator[] = (int) $forum_id;
}
// Direct child of current branch
$parent_id = $forum_id;
$forum_rows[$forum_id] = $row;
if ($row['forum_type'] == FORUM_CAT && $row['parent_id'] == $root_data['forum_id'])
{
$branch_root_id = $forum_id;
}
$forum_rows[$parent_id]['forum_id_last_post'] = $row['forum_id'];
$forum_rows[$parent_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
}
else if ($row['forum_type'] != FORUM_CAT)
{
$subforums[$parent_id][$forum_id]['display'] = ($row['display_on_index']) ? true : false;
$subforums[$parent_id][$forum_id]['name'] = $row['forum_name'];
$subforums[$parent_id][$forum_id]['orig_forum_last_post_time'] = $row['forum_last_post_time'];
$subforums[$parent_id][$forum_id]['children'] = array();
if (isset($subforums[$parent_id][$row['parent_id']]) && !$row['display_on_index'])
{
$subforums[$parent_id][$row['parent_id']]['children'][] = $forum_id;
}
if (!$forum_rows[$parent_id]['forum_id_unapproved_topics'] && $row['forum_id_unapproved_topics'])
{
$forum_rows[$parent_id]['forum_id_unapproved_topics'] = $forum_id;
}
$forum_rows[$parent_id]['forum_topics'] += $row['forum_topics'];
// Do not list redirects in LINK Forums as Posts.
if ($row['forum_type'] != FORUM_LINK)
{
$forum_rows[$parent_id]['forum_posts'] += $row['forum_posts'];
}
if ($row['forum_last_post_time'] > $forum_rows[$parent_id]['forum_last_post_time'])
{
$forum_rows[$parent_id]['forum_last_post_id'] = $row['forum_last_post_id'];
$forum_rows[$parent_id]['forum_last_post_subject'] = $row['forum_last_post_subject'];
$forum_rows[$parent_id]['forum_last_post_time'] = $row['forum_last_post_time'];
$forum_rows[$parent_id]['forum_last_poster_id'] = $row['forum_last_poster_id'];
$forum_rows[$parent_id]['forum_last_poster_name'] = $row['forum_last_poster_name'];
$forum_rows[$parent_id]['forum_last_poster_colour'] = $row['forum_last_poster_colour'];
$forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
}
}
/**
* Event to modify the forum rows data set
*
* This event is triggered once per forum
*
* @event core.display_forums_modify_forum_rows
* @var array forum_rows Data array of all forums we display
* @var array subforums Data array of all subforums we display
* @var int branch_root_id Current top-level forum
* @var int parent_id Current parent forum
* @var array row The data of the forum
* @since 3.1-A1
*/
$vars = array('forum_rows', 'subforums', 'branch_root_id', 'parent_id', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_forum_rows', compact($vars)));
}
$db->sql_freeresult($result);
// Handle marking posts
if ($mark_read == 'forums')
{
$redirect = build_url(array('mark', 'hash', 'mark_time'));
$token = request_var('hash', '');
if (check_link_hash($token, 'global'))
{
markread('topics', $forum_ids, false, request_var('mark_time', 0));
$message = sprintf($user->lang['RETURN_FORUM'], '', '');
meta_refresh(3, $redirect);
if ($request->is_ajax())
{
// Tell the ajax script what language vars and URL need to be replaced
$data = array(
'NO_UNREAD_POSTS' => $user->lang['NO_UNREAD_POSTS'],
'UNREAD_POSTS' => $user->lang['UNREAD_POSTS'],
'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&f=' . $root_data['forum_id'] . '&mark=forums&mark_time=' . time()) : '',
'MESSAGE_TITLE' => $user->lang['INFORMATION'],
'MESSAGE_TEXT' => $user->lang['FORUMS_MARKED']
);
$json_response = new phpbb_json_response();
$json_response->send($data);
}
trigger_error($user->lang['FORUMS_MARKED'] . '
' . $message);
}
else
{
$message = sprintf($user->lang['RETURN_PAGE'], '', '');
meta_refresh(3, $redirect);
trigger_error($message);
}
}
// Grab moderators ... if necessary
if ($display_moderators)
{
if ($return_moderators)
{
$forum_ids_moderator[] = $root_data['forum_id'];
}
get_moderators($forum_moderators, $forum_ids_moderator);
}
// Used to tell whatever we have to create a dummy category or not.
$last_catless = true;
foreach ($forum_rows as $row)
{
// Empty category
if ($row['parent_id'] == $root_data['forum_id'] && $row['forum_type'] == FORUM_CAT)
{
$template->assign_block_vars('forumrow', array(
'S_IS_CAT' => true,
'FORUM_ID' => $row['forum_id'],
'FORUM_NAME' => $row['forum_name'],
'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
'FORUM_FOLDER_IMG' => '',
'FORUM_FOLDER_IMG_SRC' => '',
'FORUM_IMAGE' => ($row['forum_image']) ? '' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
'U_VIEWFORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']))
);
continue;
}
$visible_forums++;
$forum_id = $row['forum_id'];
$forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;
$folder_image = $folder_alt = $l_subforums = '';
$subforums_list = array();
// Generate list of subforums if we need to
if (isset($subforums[$forum_id]))
{
foreach ($subforums[$forum_id] as $subforum_id => $subforum_row)
{
$subforum_unread = (isset($forum_tracking_info[$subforum_id]) && $subforum_row['orig_forum_last_post_time'] > $forum_tracking_info[$subforum_id]) ? true : false;
if (!$subforum_unread && !empty($subforum_row['children']))
{
foreach ($subforum_row['children'] as $child_id)
{
if (isset($forum_tracking_info[$child_id]) && $subforums[$forum_id][$child_id]['orig_forum_last_post_time'] > $forum_tracking_info[$child_id])
{
// Once we found an unread child forum, we can drop out of this loop
$subforum_unread = true;
break;
}
}
}
if ($subforum_row['display'] && $subforum_row['name'])
{
$subforums_list[] = array(
'link' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $subforum_id),
'name' => $subforum_row['name'],
'unread' => $subforum_unread,
);
}
else
{
unset($subforums[$forum_id][$subforum_id]);
}
// If one subforum is unread the forum gets unread too...
if ($subforum_unread)
{
$forum_unread = true;
}
}
$l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] . ': ' : $user->lang['SUBFORUMS'] . ': ';
$folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
}
else
{
switch ($row['forum_type'])
{
case FORUM_POST:
$folder_image = ($forum_unread) ? 'forum_unread' : 'forum_read';
break;
case FORUM_LINK:
$folder_image = 'forum_link';
break;
}
}
// Which folder should we display?
if ($row['forum_status'] == ITEM_LOCKED)
{
$folder_image = ($forum_unread) ? 'forum_unread_locked' : 'forum_read_locked';
$folder_alt = 'FORUM_LOCKED';
}
else
{
$folder_alt = ($forum_unread) ? 'UNREAD_POSTS' : 'NO_UNREAD_POSTS';
}
// Create last post link information, if appropriate
if ($row['forum_last_post_id'])
{
$last_post_subject = $row['forum_last_post_subject'];
$last_post_subject_truncated = truncate_string(censor_text($last_post_subject), 30, 255, false, $user->lang['ELLIPSIS']);
$last_post_time = $user->format_date($row['forum_last_post_time']);
$last_post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id_last_post'] . '&p=' . $row['forum_last_post_id']) . '#p' . $row['forum_last_post_id'];
}
else
{
$last_post_subject = $last_post_time = $last_post_url = $last_post_subject_truncated = '';
}
// Output moderator listing ... if applicable
$l_moderator = $moderators_list = '';
if ($display_moderators && !empty($forum_moderators[$forum_id]))
{
$l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
$moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]);
}
$l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
$post_click_count = ($row['forum_type'] != FORUM_LINK || $row['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? $row['forum_posts'] : '';
$s_subforums_list = array();
foreach ($subforums_list as $subforum)
{
$s_subforums_list[] = '' . $subforum['name'] . '';
}
$s_subforums_list = (string) implode($user->lang['COMMA_SEPARATOR'], $s_subforums_list);
$catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
if ($row['forum_type'] != FORUM_LINK)
{
$u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
}
else
{
// If the forum is a link and we count redirects we need to visit it
// If the forum is having a password or no read access we do not expose the link, but instead handle it in viewforum
if (($row['forum_flags'] & FORUM_FLAG_LINK_TRACK) || $row['forum_password'] || !$auth->acl_get('f_read', $forum_id))
{
$u_viewforum = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']);
}
else
{
$u_viewforum = $row['forum_link'];
}
}
$forum_row = array(
'S_IS_CAT' => false,
'S_NO_CAT' => $catless && !$last_catless,
'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false,
'S_UNREAD_FORUM' => $forum_unread,
'S_AUTH_READ' => $auth->acl_get('f_read', $row['forum_id']),
'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false,
'S_DISPLAY_SUBJECT' => ($last_post_subject && $config['display_last_subject'] && !$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? true : false,
'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
'FORUM_ID' => $row['forum_id'],
'FORUM_NAME' => $row['forum_name'],
'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
'TOPICS' => $row['forum_topics'],
$l_post_click_count => $post_click_count,
'FORUM_IMG_STYLE' => $folder_image,
'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt),
'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
'FORUM_IMAGE' => ($row['forum_image']) ? '
' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
'LAST_POST_SUBJECT' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? censor_text($last_post_subject) : "",
'LAST_POST_SUBJECT_TRUNCATED' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? $last_post_subject_truncated : "",
'LAST_POST_TIME' => $last_post_time,
'LAST_POSTER' => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'LAST_POSTER_COLOUR' => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'LAST_POSTER_FULL' => get_username_string('full', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'MODERATORS' => $moderators_list,
'SUBFORUMS' => $s_subforums_list,
'L_SUBFORUM_STR' => $l_subforums,
'L_MODERATOR_STR' => $l_moderator,
'U_UNAPPROVED_TOPICS' => ($row['forum_id_unapproved_topics']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=unapproved_topics&f=' . $row['forum_id_unapproved_topics']) : '',
'U_VIEWFORUM' => $u_viewforum,
'U_LAST_POSTER' => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'U_LAST_POST' => $last_post_url,
);
/**
* Modify the template data block of the forum
*
* This event is triggered once per forum
*
* @event core.display_forums_modify_template_vars
* @var array forum_row Template data of the forum
* @var array row The data of the forum
* @since 3.1-A1
*/
$vars = array('forum_row', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_template_vars', compact($vars)));
$template->assign_block_vars('forumrow', $forum_row);
// Assign subforums loop for style authors
foreach ($subforums_list as $subforum)
{
$template->assign_block_vars('forumrow.subforum', array(
'U_SUBFORUM' => $subforum['link'],
'SUBFORUM_NAME' => $subforum['name'],
'S_UNREAD' => $subforum['unread'])
);
}
$last_catless = $catless;
}
$template->assign_vars(array(
'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&f=' . $root_data['forum_id'] . '&mark=forums&mark_time=' . time()) : '',
'S_HAS_SUBFORUM' => ($visible_forums) ? true : false,
'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
));
if ($return_moderators)
{
return array($active_forum_ary, $forum_moderators);
}
return array($active_forum_ary, array());
}
/**
* Create forum rules for given forum
*/
function generate_forum_rules(&$forum_data)
{
if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link'])
{
return;
}
global $template, $phpbb_root_path, $phpEx;
if ($forum_data['forum_rules'])
{
$forum_data['forum_rules'] = generate_text_for_display($forum_data['forum_rules'], $forum_data['forum_rules_uid'], $forum_data['forum_rules_bitfield'], $forum_data['forum_rules_options']);
}
$template->assign_vars(array(
'S_FORUM_RULES' => true,
'U_FORUM_RULES' => $forum_data['forum_rules_link'],
'FORUM_RULES' => $forum_data['forum_rules'])
);
}
/**
* Create forum navigation links for given forum, create parent
* list if currently null, assign basic forum info to template
*/
function generate_forum_nav(&$forum_data)
{
global $db, $user, $template, $auth, $config;
global $phpEx, $phpbb_root_path;
if (!$auth->acl_get('f_list', $forum_data['forum_id']))
{
return;
}
// Get forum parents
$forum_parents = get_forum_parents($forum_data);
// Build navigation links
if (!empty($forum_parents))
{
foreach ($forum_parents as $parent_forum_id => $parent_data)
{
list($parent_name, $parent_type) = array_values($parent_data);
// Skip this parent if the user does not have the permission to view it
if (!$auth->acl_get('f_list', $parent_forum_id))
{
continue;
}
$template->assign_block_vars('navlinks', array(
'S_IS_CAT' => ($parent_type == FORUM_CAT) ? true : false,
'S_IS_LINK' => ($parent_type == FORUM_LINK) ? true : false,
'S_IS_POST' => ($parent_type == FORUM_POST) ? true : false,
'FORUM_NAME' => $parent_name,
'FORUM_ID' => $parent_forum_id,
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $parent_forum_id))
);
}
}
$template->assign_block_vars('navlinks', array(
'S_IS_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
'S_IS_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
'S_IS_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false,
'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_ID' => $forum_data['forum_id'],
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_data['forum_id']))
);
$template->assign_vars(array(
'FORUM_ID' => $forum_data['forum_id'],
'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_DESC' => generate_text_for_display($forum_data['forum_desc'], $forum_data['forum_desc_uid'], $forum_data['forum_desc_bitfield'], $forum_data['forum_desc_options']),
'S_ENABLE_FEEDS_FORUM' => ($config['feed_forum'] && $forum_data['forum_type'] == FORUM_POST && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $forum_data['forum_options'])) ? true : false,
));
return;
}
/**
* Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise
*/
function get_forum_parents(&$forum_data)
{
global $db;
$forum_parents = array();
if ($forum_data['parent_id'] > 0)
{
if ($forum_data['forum_parents'] == '')
{
$sql = 'SELECT forum_id, forum_name, forum_type
FROM ' . FORUMS_TABLE . '
WHERE left_id < ' . $forum_data['left_id'] . '
AND right_id > ' . $forum_data['right_id'] . '
ORDER BY left_id ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']);
}
$db->sql_freeresult($result);
$forum_data['forum_parents'] = serialize($forum_parents);
$sql = 'UPDATE ' . FORUMS_TABLE . "
SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "'
WHERE parent_id = " . $forum_data['parent_id'];
$db->sql_query($sql);
}
else
{
$forum_parents = unserialize($forum_data['forum_parents']);
}
}
return $forum_parents;
}
/**
* Obtain list of moderators of each forum
*/
function get_moderators(&$forum_moderators, $forum_id = false)
{
global $config, $template, $db, $phpbb_root_path, $phpEx, $user, $auth;
$forum_id_ary = array();
if ($forum_id !== false)
{
if (!is_array($forum_id))
{
$forum_id = array($forum_id);
}
// Exchange key/value pair to be able to faster check for the forum id existence
$forum_id_ary = array_flip($forum_id);
}
$sql_array = array(
'SELECT' => 'm.*, u.user_colour, g.group_colour, g.group_type',
'FROM' => array(
MODERATOR_CACHE_TABLE => 'm',
),
'LEFT_JOIN' => array(
array(
'FROM' => array(USERS_TABLE => 'u'),
'ON' => 'm.user_id = u.user_id',
),
array(
'FROM' => array(GROUPS_TABLE => 'g'),
'ON' => 'm.group_id = g.group_id',
),
),
'WHERE' => 'm.display_on_index = 1',
);
// We query every forum here because for caching we should not have any parameter.
$sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql, 3600);
while ($row = $db->sql_fetchrow($result))
{
$f_id = (int) $row['forum_id'];
if (!isset($forum_id_ary[$f_id]))
{
continue;
}
if (!empty($row['user_id']))
{
$forum_moderators[$f_id][] = get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']);
}
else
{
$group_name = (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']);
if ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile'))
{
$forum_moderators[$f_id][] = '' . $group_name . '';
}
else
{
$forum_moderators[$f_id][] = '' . $group_name . '';
}
}
}
$db->sql_freeresult($result);
return;
}
/**
* User authorisation levels output
*
* @param string $mode Can be forum or topic. Not in use at the moment.
* @param int $forum_id The current forum the user is in.
* @param int $forum_status The forums status bit.
*/
function gen_forum_auth_level($mode, $forum_id, $forum_status)
{
global $template, $auth, $user, $config;
$locked = ($forum_status == ITEM_LOCKED && !$auth->acl_get('m_edit', $forum_id)) ? true : false;
$rules = array(
($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'],
($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'],
($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'],
($user->data['is_registered'] && ($auth->acl_gets('f_delete', 'm_delete', $forum_id) || $auth->acl_gets('f_softdelete', 'm_softdelete', $forum_id)) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
);
if ($config['allow_attachments'])
{
$rules[] = ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach') && !$locked) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'];
}
foreach ($rules as $rule)
{
$template->assign_block_vars('rules', array('RULE' => $rule));
}
return;
}
/**
* Generate topic status
*/
function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$folder_alt, &$topic_type)
{
global $user, $config;
$folder = $folder_new = '';
if ($topic_row['topic_status'] == ITEM_MOVED)
{
$topic_type = $user->lang['VIEW_TOPIC_MOVED'];
$folder_img = 'topic_moved';
$folder_alt = 'TOPIC_MOVED';
}
else
{
switch ($topic_row['topic_type'])
{
case POST_GLOBAL:
$topic_type = $user->lang['VIEW_TOPIC_GLOBAL'];
$folder = 'global_read';
$folder_new = 'global_unread';
break;
case POST_ANNOUNCE:
$topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
$folder = 'announce_read';
$folder_new = 'announce_unread';
break;
case POST_STICKY:
$topic_type = $user->lang['VIEW_TOPIC_STICKY'];
$folder = 'sticky_read';
$folder_new = 'sticky_unread';
break;
default:
$topic_type = '';
$folder = 'topic_read';
$folder_new = 'topic_unread';
// Hot topic threshold is for posts in a topic, which is replies + the first post. ;)
if ($config['hot_threshold'] && ($replies + 1) >= $config['hot_threshold'] && $topic_row['topic_status'] != ITEM_LOCKED)
{
$folder .= '_hot';
$folder_new .= '_hot';
}
break;
}
if ($topic_row['topic_status'] == ITEM_LOCKED)
{
$topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
$folder .= '_locked';
$folder_new .= '_locked';
}
$folder_img = ($unread_topic) ? $folder_new : $folder;
$folder_alt = ($unread_topic) ? 'UNREAD_POSTS' : (($topic_row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_UNREAD_POSTS');
// Posted image?
if (!empty($topic_row['topic_posted']) && $topic_row['topic_posted'])
{
$folder_img .= '_mine';
}
}
if ($topic_row['poll_start'] && $topic_row['topic_status'] != ITEM_MOVED)
{
$topic_type = $user->lang['VIEW_TOPIC_POLL'];
}
}
/**
* Assign/Build custom bbcodes for display in screens supporting using of bbcodes
* The custom bbcodes buttons will be placed within the template block 'custom_codes'
*/
function display_custom_bbcodes()
{
global $db, $template, $user, $phpbb_dispatcher;
// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
$num_predefined_bbcodes = 22;
$sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
FROM ' . BBCODES_TABLE . '
WHERE display_on_posting = 1
ORDER BY bbcode_tag';
$result = $db->sql_query($sql);
$i = 0;
while ($row = $db->sql_fetchrow($result))
{
// If the helpline is defined within the language file, we will use the localised version, else just use the database entry...
if (isset($user->lang[strtoupper($row['bbcode_helpline'])]))
{
$row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])];
}
$custom_tags = array(
'BBCODE_NAME' => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
'BBCODE_ID' => $num_predefined_bbcodes + ($i * 2),
'BBCODE_TAG' => $row['bbcode_tag'],
'BBCODE_HELPLINE' => $row['bbcode_helpline'],
'A_BBCODE_HELPLINE' => str_replace(array('&', '"', "'", '<', '>'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
);
/**
* Modify the template data block of a bbcode
*
* This event is triggered once per bbcode
*
* @event core.display_custom_bbcodes_modify_row
* @var array custom_tags Template data of the bbcode
* @var array row The data of the bbcode
* @since 3.1-A1
*/
$vars = array('custom_tags', 'row');
extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_row', compact($vars)));
$template->assign_block_vars('custom_tags', $custom_tags);
$i++;
}
$db->sql_freeresult($result);
/**
* Display custom bbcodes
*
* @event core.display_custom_bbcodes
* @since 3.1-A1
*/
$phpbb_dispatcher->dispatch('core.display_custom_bbcodes');
}
/**
* Display reasons
*/
function display_reasons($reason_id = 0)
{
global $db, $user, $template;
$sql = 'SELECT *
FROM ' . REPORTS_REASONS_TABLE . '
ORDER BY reason_order ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
// If the reason is defined within the language file, we will use the localized version, else just use the database entry...
if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
{
$row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
$row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
}
$template->assign_block_vars('reason', array(
'ID' => $row['reason_id'],
'TITLE' => $row['reason_title'],
'DESCRIPTION' => $row['reason_description'],
'S_SELECTED' => ($row['reason_id'] == $reason_id) ? true : false)
);
}
$db->sql_freeresult($result);
}
/**
* Display user activity (action forum/topic)
*/
function display_user_activity(&$userdata)
{
global $auth, $template, $db, $user;
global $phpbb_root_path, $phpEx, $phpbb_container;
// Do not display user activity for users having more than 5000 posts...
if ($userdata['user_posts'] > 5000)
{
return;
}
$forum_ary = array();
$forum_read_ary = $auth->acl_getf('f_read');
foreach ($forum_read_ary as $forum_id => $allowed)
{
if ($allowed['f_read'])
{
$forum_ary[] = (int) $forum_id;
}
}
$forum_ary = array_diff($forum_ary, $user->get_passworded_forums());
$active_f_row = $active_t_row = array();
if (!empty($forum_ary))
{
$phpbb_content_visibility = $phpbb_container->get('content.visibility');
// Obtain active forum
$sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
FROM ' . POSTS_TABLE . '
WHERE poster_id = ' . $userdata['user_id'] . '
AND post_postcount = 1
AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
GROUP BY forum_id
ORDER BY num_posts DESC';
$result = $db->sql_query_limit($sql, 1);
$active_f_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!empty($active_f_row))
{
$sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . '
WHERE forum_id = ' . $active_f_row['forum_id'];
$result = $db->sql_query($sql, 3600);
$active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
$db->sql_freeresult($result);
}
// Obtain active topic
$sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
FROM ' . POSTS_TABLE . '
WHERE poster_id = ' . $userdata['user_id'] . '
AND post_postcount = 1
AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
GROUP BY topic_id
ORDER BY num_posts DESC';
$result = $db->sql_query_limit($sql, 1);
$active_t_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!empty($active_t_row))
{
$sql = 'SELECT topic_title
FROM ' . TOPICS_TABLE . '
WHERE topic_id = ' . $active_t_row['topic_id'];
$result = $db->sql_query($sql);
$active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
$db->sql_freeresult($result);
}
}
$userdata['active_t_row'] = $active_t_row;
$userdata['active_f_row'] = $active_f_row;
$active_f_name = $active_f_id = $active_f_count = $active_f_pct = '';
if (!empty($active_f_row['num_posts']))
{
$active_f_name = $active_f_row['forum_name'];
$active_f_id = $active_f_row['forum_id'];
$active_f_count = $active_f_row['num_posts'];
$active_f_pct = ($userdata['user_posts']) ? ($active_f_count / $userdata['user_posts']) * 100 : 0;
}
$active_t_name = $active_t_id = $active_t_count = $active_t_pct = '';
if (!empty($active_t_row['num_posts']))
{
$active_t_name = $active_t_row['topic_title'];
$active_t_id = $active_t_row['topic_id'];
$active_t_count = $active_t_row['num_posts'];
$active_t_pct = ($userdata['user_posts']) ? ($active_t_count / $userdata['user_posts']) * 100 : 0;
}
$l_active_pct = ($userdata['user_id'] != ANONYMOUS && $userdata['user_id'] == $user->data['user_id']) ? $user->lang['POST_PCT_ACTIVE_OWN'] : $user->lang['POST_PCT_ACTIVE'];
$template->assign_vars(array(
'ACTIVE_FORUM' => $active_f_name,
'ACTIVE_FORUM_POSTS' => $user->lang('USER_POSTS', (int) $active_f_count),
'ACTIVE_FORUM_PCT' => sprintf($l_active_pct, $active_f_pct),
'ACTIVE_TOPIC' => censor_text($active_t_name),
'ACTIVE_TOPIC_POSTS' => $user->lang('USER_POSTS', (int) $active_t_count),
'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct),
'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
'S_SHOW_ACTIVITY' => true)
);
}
/**
* Topic and forum watching common code
*/
function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0, $item_title = '')
{
global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
global $request;
$table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
$where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
$match_id = ($mode == 'forum') ? $forum_id : $topic_id;
$u_url = "uid={$user->data['user_id']}";
$u_url .= ($mode == 'forum') ? '&f' : '&f=' . $forum_id . '&t';
$is_watching = 0;
// Is user watching this thread?
if ($user_id != ANONYMOUS)
{
$can_watch = true;
if ($notify_status == 'unset')
{
$sql = "SELECT notify_status
FROM $table_sql
WHERE $where_sql = $match_id
AND user_id = $user_id";
$result = $db->sql_query($sql);
$notify_status = ($row = $db->sql_fetchrow($result)) ? $row['notify_status'] : NULL;
$db->sql_freeresult($result);
}
if (!is_null($notify_status) && $notify_status !== '')
{
if (isset($_GET['unwatch']))
{
$uid = request_var('uid', 0);
$token = request_var('hash', '');
if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
{
if ($uid != $user_id || $request->variable('unwatch', '', false, phpbb_request_interface::GET) != $mode)
{
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start");
$message = $user->lang['ERR_UNWATCHING'] . '
' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', '');
trigger_error($message);
}
$sql = 'DELETE FROM ' . $table_sql . "
WHERE $where_sql = $match_id
AND user_id = $user_id";
$db->sql_query($sql);
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start");
$message = $user->lang['NOT_WATCHING_' . strtoupper($mode)] . '
';
$message .= sprintf($user->lang['RETURN_' . strtoupper($mode)], '', '');
meta_refresh(3, $redirect_url);
trigger_error($message);
}
else
{
$s_hidden_fields = array(
'uid' => $user->data['user_id'],
'unwatch' => $mode,
'start' => $start,
'f' => $forum_id,
);
if ($mode != 'forum')
{
$s_hidden_fields['t'] = $topic_id;
}
if ($item_title == '')
{
$confirm_box_message = 'UNWATCH_' . strtoupper($mode);
}
else
{
$confirm_box_message = $user->lang('UNWATCH_' . strtoupper($mode) . '_DETAILED', $item_title);
}
confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
}
}
else
{
$is_watching = true;
if ($notify_status != NOTIFY_YES)
{
$sql = 'UPDATE ' . $table_sql . "
SET notify_status = " . NOTIFY_YES . "
WHERE $where_sql = $match_id
AND user_id = $user_id";
$db->sql_query($sql);
}
}
}
else
{
if (isset($_GET['watch']))
{
$uid = request_var('uid', 0);
$token = request_var('hash', '');
if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
{
if ($uid != $user_id || $request->variable('watch', '', false, phpbb_request_interface::GET) != $mode)
{
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start");
$message = $user->lang['ERR_WATCHING'] . '
' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', '');
trigger_error($message);
}
$is_watching = true;
$sql = 'INSERT INTO ' . $table_sql . " (user_id, $where_sql, notify_status)
VALUES ($user_id, $match_id, " . NOTIFY_YES . ')';
$db->sql_query($sql);
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&start=$start");
$message = $user->lang['ARE_WATCHING_' . strtoupper($mode)] . '
' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '', '');
meta_refresh(3, $redirect_url);
trigger_error($message);
}
else
{
$s_hidden_fields = array(
'uid' => $user->data['user_id'],
'watch' => $mode,
'start' => $start,
'f' => $forum_id,
);
if ($mode != 'forum')
{
$s_hidden_fields['t'] = $topic_id;
}
$confirm_box_message = (($item_title == '') ? 'WATCH_' . strtoupper($mode) : $user->lang('WATCH_' . strtoupper($mode) . '_DETAILED', $item_title));
confirm_box(false, $confirm_box_message, build_hidden_fields($s_hidden_fields));
}
}
else
{
$is_watching = 0;
}
}
}
else
{
if ((isset($_GET['unwatch']) && $request->variable('unwatch', '', false, phpbb_request_interface::GET) == $mode) ||
(isset($_GET['watch']) && $request->variable('watch', '', false, phpbb_request_interface::GET) == $mode))
{
login_box();
}
else
{
$can_watch = 0;
$is_watching = 0;
}
}
if ($can_watch)
{
$s_watching['link'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&" . (($is_watching) ? 'unwatch' : 'watch') . "=$mode&start=$start&hash=" . generate_link_hash("{$mode}_$match_id"));
$s_watching['link_toggle'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&" . ((!$is_watching) ? 'unwatch' : 'watch') . "=$mode&start=$start&hash=" . generate_link_hash("{$mode}_$match_id"));
$s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
$s_watching['title_toggle'] = $user->lang[((!$is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
$s_watching['is_watching'] = $is_watching;
}
return;
}
/**
* Get user rank title and image
*
* @param int $user_rank the current stored users rank id
* @param int $user_posts the users number of posts
* @param string &$rank_title the rank title will be stored here after execution
* @param string &$rank_img the rank image as full img tag is stored here after execution
* @param string &$rank_img_src the rank image source is stored here after execution
*
* Note: since we do not want to break backwards-compatibility, this function will only properly assign ranks to guests if you call it for them with user_posts == false
*/
function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
{
global $ranks, $config, $phpbb_root_path;
if (empty($ranks))
{
global $cache;
$ranks = $cache->obtain_ranks();
}
if (!empty($user_rank))
{
$rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : '';
$rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '' : '';
$rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : '';
}
else if ($user_posts !== false)
{
if (!empty($ranks['normal']))
{
foreach ($ranks['normal'] as $rank)
{
if ($user_posts >= $rank['rank_min'])
{
$rank_title = $rank['rank_title'];
$rank_img = (!empty($rank['rank_image'])) ? '
' : '';
$rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] : '';
break;
}
}
}
}
}
/**
* Get user avatar
*
* @param array $user_row Row from the users table
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
* @return string Avatar html
*/
function phpbb_get_user_avatar($user_row, $alt = 'USER_AVATAR', $ignore_config = false)
{
$row = phpbb_avatar_manager::clean_row($user_row);
return phpbb_get_avatar($row, $alt, $ignore_config);
}
/**
* Get group avatar
*
* @param array $group_row Row from the groups table
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
* @return string Avatar html
*/
function phpbb_get_group_avatar($user_row, $alt = 'GROUP_AVATAR', $ignore_config = false)
{
$row = phpbb_avatar_manager::clean_row($user_row);
return phpbb_get_avatar($row, $alt, $ignore_config);
}
/**
* Get avatar
*
* @param array $row Row cleaned by phpbb_avatar_driver::clean_row
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
* @return string Avatar html
*/
function phpbb_get_avatar($row, $alt, $ignore_config = false)
{
global $user, $config, $cache, $phpbb_root_path, $phpEx;
global $request;
global $phpbb_container;
if (!$config['allow_avatar'] && !$ignore_config)
{
return '';
}
$avatar_data = array(
'src' => $row['avatar'],
'width' => $row['avatar_width'],
'height' => $row['avatar_height'],
);
$phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
$driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], $ignore_config);
$html = '';
if ($driver)
{
$html = $driver->get_custom_html($user, $row, $alt);
if (!empty($html))
{
return $html;
}
$avatar_data = $driver->get_data($row, $ignore_config);
}
else
{
$avatar_data['src'] = '';
}
if (!empty($avatar_data['src']))
{
$html = '
lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';
}
return $html;
}
/**
* Generate a list of archive types available for compressing attachments
*
* @param string $param_key Either topic_id or post_id
* @param string $param_val The value of the topic or post id
* @param string $phpbb_root_path The root path of the phpBB installation
* @param string $phpEx The PHP extension
*
* @return array Array containing the link and the type of compression
*/
function phpbb_gen_download_links($param_key, $param_val, $phpbb_root_path, $phpEx)
{
if (!class_exists('compress'))
{
require $phpbb_root_path . 'includes/functions_compress.' . $phpEx;
}
$methods = compress::methods();
$links = array();
foreach ($methods as $method)
{
$exploded = explode('.', $method);
$type = array_pop($exploded);
$params = array('archive' => $method);
$params[$param_key] = $param_val;
$links[] = array(
'LINK' => append_sid("{$phpbb_root_path}download/file.$phpEx", $params),
'TYPE' => $type,
);
}
return $links;
}
a>
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
# translation of DrakX-vi.po to
# Vietnamese Translation for DrakX module.
# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
# Trinh Minh Thanh <tmthanh@yahoo.com> 2001-2005.
# Larry Nguyen <larry@vnlinux.org> 2005.
msgid ""
msgstr ""
"Project-Id-Version: DrakX-vi version\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-09-12 12:22+0200\n"
"PO-Revision-Date: 2005-06-02 21:17+0700\n"
"Last-Translator: Larry Nguyen <larry@vnlinux.org>\n"
"Language-Team: <gnomevi-list@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../help.pm:14
#, fuzzy, c-format
msgid ""
"Before continuing, you should carefully read the terms of the license. It\n"
"covers the entire Mageia distribution. If you agree with all the\n"
"terms it contains, check the \"%s\" box. If not, clicking on the \"%s\"\n"
"button will reboot your computer."
msgstr ""
"Trước khi tiếp tục, hãy đọc kỹ các điều khoản ghi trong bản quyền.\n"
"Nó bao xuyên suốt toàn bộ phân phối Mageia. Nếu đồng ý với\n"
"mọi điều khoản trong đó, nhấn vào hộp kiểm \"%s\". Nếu không, hãy\n"
"nhấn nút \"%s\" để khởi động lại máy tính."
#: ../help.pm:20
#, c-format
msgid ""
"GNU/Linux is a multi-user system which means each user can have his or her\n"
"own preferences, own files and so on. But unlike \"root\", who is the\n"
"system administrator, the users you add at this point will not be "
"authorized\n"
"to change anything except their own files and their own configurations,\n"
"protecting the system from unintentional or malicious changes which could\n"
"impact on the system as a whole. You'll have to create at least one regular\n"
"user for yourself -- this is the account which you should use for routine,\n"
"day-to-day usage. Although it's very easy to log in as \"root\" to do\n"
"anything and everything, it may also be very dangerous! A very simple\n"
"mistake could mean that your system will not work any more. If you make a\n"
"serious mistake as a regular user, the worst that can happen is that you'll\n"
"lose some information, but you will not affect the entire system.\n"
"\n"
"The first field asks you for a real name. Of course, this is not mandatory\n"
"-- you can actually enter whatever you like. DrakX will use the first word\n"
"you type in this field and copy it to the \"%s\" one, which is the name\n"
"this user will enter to log onto the system. If you like, you may override\n"
"the default and change the user name. The next step is to enter a password.\n"
"From a security point of view, a non-privileged (regular) user password is\n"
"not as crucial as the \"root\" password, but that's no reason to neglect it\n"
"by making it blank or too simple: after all, your files could be the ones\n"
"at risk.\n"
"\n"
"Once you click on \"%s\", you can add other users. Add a user for each one\n"
"of your friends, your father, your sister, etc. Click \"%s\" when you're\n"
"finished adding users.\n"
"\n"
"Clicking the \"%s\" button allows you to change the default \"shell\" for\n"
"that user (bash by default).\n"
"\n"
"When you're finished adding users, you'll be asked to choose a user who\n"
"will be automatically logged into the system when the computer boots up. If\n"
"you're interested in that feature (and do not care much about local\n"
"security), choose the desired user and window manager, then click on\n"
"\"%s\". If you're not interested in this feature, uncheck the \"%s\" box."
msgstr ""
"GNU/Linux là hệ thống đa người dùng, nghĩa là từng người dùng có thể có\n"
"riêng các tùy thích, tập tin,... Bạn có thể đọc ``Starter Guide'' để biết "
"thêm\n"
"điều này.Nhưng không như \"root\", là người quản trị, các người dùng mà bạn\n"
"thêm vào đây sẽ không được quyền thay đổi bất kỳ cái gì ngoài các tập tin\n"
"và cấu hình của riêng họ. Bạn sẽ phải tạo ít nhất một người dùng thường lệ\n"
"cho mình. Đó là tài khoản mà bạn nên dùng cho công việc hàng ngày. Mặc\n"
"dù bạn cũng có thể đăng nhập \"root\" để làm việc, nhưng sẽ rất nguy hiểm!\n"
"Chỉ một lỗi nhỏ cũng có thể làm hệ thống không hoạt động nữa. Nếu bạn\n"
"gây một lỗi trầm trọng khi là người dùng thông thường, bạn có thể chỉ mất "
"một\n"
"số thông tin mà không làm ảnh hưởng tới toàn bộ hệ thống.\n"
"\n"
"Trường thứ nhất hỏi tên thật của bạn. Tuy nhiên, điều này không phải là bắt\n"
"buộc. -- có thể nhập bất kỳ cái gì bạn muốn. DrakX sẽ lấy từ đầu tiên mà "
"bạn\n"
"nhập để đem nhập vào trường \"%s\", là tên mà người dùng này\n"
"sẽ sử dụng để đăng nhập vào hệ thống. Nếu muốn, bạn có thể thay đổi nó.\n"
"Bước tiếp theo là nhập mật khẩu. Về phương diện bảo mật, mật khẩu của người\n"
"dùng thông thường không quan trọng như mật khẩu \"root\", nhưng cũng đừng\n"
"để trống hay đặt quá đơn giản để bảo vệ các tập tin riêng của bạn.\n"
"\n"
"Mỗi khi nhấn \"%s\", bạn có thể thêm người dùng khác cho người thân như\n"
"anh chị em... của bạn. Nhấn \"%s\" khi đã hoàn thành việc thêm người dùng.\n"
"\n"
"Nhấn nút \"%s\" cho phép bạn thay đổi \"shell\" mặc định cho người dùng\n"
"đó (mặc định là bash).\n"
"\n"
"Khi đã hoàn thành việc thêm người dùng, bạn có thể chọn người dùng nào sẽ\n"
"được tự động đăng nhập vào hệ thống khi khởi động máy tính. Nếu bạn thích\n"
"tính năng này và không quan tâm nhiều đến bảo mật nội bộ, hãy chọn người\n"
"dùng mong muốn và trình quản lý cửa sổ rối nhấn \"%s\". Nếu không thích\n"
"dùng tính năng này, hãy bỏ chọn hộp kiểm \"%s\"."
#: ../help.pm:54
#, c-format
msgid "User name"
msgstr ""
#: ../help.pm:54
#, c-format
msgid "Accept user"
msgstr ""
#: ../help.pm:54
#, c-format
msgid "Do you want to use this feature?"
msgstr "Bạn muốn dùng tính năng này không?"
#: ../help.pm:57
#, c-format
msgid ""
"Listed here are the existing Linux partitions detected on your hard disk drive.\n"
"You can keep the choices made by the wizard, since they are good for most\n"
"common installations. If you make any changes, you must at least define a\n"
"root partition (\"/\"). Do not choose too small a partition or you will not\n"
"be able to install enough software. If you want to store your data on a\n"
"separate partition, you will also need to create a \"/home\" partition\n"
"(only possible if you have more than one Linux partition available).\n"
"\n"
"Each partition is listed as follows: \"Name\", \"Capacity\".\n"
"\n"
"\"Name\" is structured: \"hard disk drive type\", \"hard disk drive number\",\n"
"\"partition number\" (for example, \"hda1\").\n"
"\n"
"\"Hard disk drive type\" is \"hd\" if your hard disk drive is an IDE hard disk drive and\n"
"\"sd\" if it is a SCSI hard disk drive.\n"
"\n"
"\"Hard disk drive number\" is always a letter after \"hd\" or \"sd\". For IDE\n"
"hard disk drives:\n"
"\n"
" * \"a\" means \"master hard disk drive on the primary IDE controller\";\n"
"\n"
" * \"b\" means \"slave hard disk drive on the primary IDE controller\";\n"
"\n"
" * \"c\" means \"master hard disk drive on the secondary IDE controller\";\n"
"\n"
" * \"d\" means \"slave hard disk drive on the secondary IDE controller\".\n"
"\n"
"With SCSI hard disk drives, an \"a\" means \"lowest SCSI ID\", a \"b\" means\n"
"\"second lowest SCSI ID\", etc."
msgstr ""
"Trên đây là danh sách các phân vùng Linux hiện có trên đĩa cứng của bạn.\n"
"Bạn có thể giữ các lựa chọn do đồ thuật tạo ra, chúng thích hợp cho hầu hết\n"
"các trường hợp thông thường. Nếu bạn tạo bất kỳ thay đổi nào, ít nhất phải\n"
"định ra một phân vùng root (\"/\"). Đừng chọn phân vùng này nhỏ quá vì có "
"thể bạn\n"
"sẽ không thể cài đặt đủ phần mềm. Nếu bạn muốn đặt dữ liệu lên một phân\n"
"vùng riêng biệt, bạn cũng cần tạo phân vùng cho \"/home\" (với điều kiện\n"
"nếu bạn có sẵn hơn một phân vùng Linux).\n"
"\n"
"Mỗi phân vùng được liệt kê như sau: \"Tên\", \"Dung lượng\".\n"
"\n"
"\"Tên\" có cấu trúc như sau: \"kiểu đĩa cứng\", \"số hiệu đĩa cứng\",\n"
"\"số hiệu phân vùng\" (ví dụ, \"hda1\").\n"
"\n"
"\"Kiểu ổ cứng\" là \"hd\" nếu ổ cứng của bạn là IDE và \"sd\"\n"
"nếu là loại SCSI.\n"
"\n"
"\"Số hiệu ổ cứng\" luôn là chữ cái đứng sau \"hd\" hoặc \"sd\". Với các\n"
"ổ cứng IDE:\n"
"\n"
" * \"a\" là \"ổ cứng chính nối với điều khiển IDE đầu tiên\",\n"
"\n"
" * \"b\" là \"ổ cứng phụ nối với điều khiển IDE đầu tiên\",\n"
"\n"
" * \"c\" là \"ổ cứng chính nối với điều khiển IDE thứ hai\",\n"
"\n"
" * \"d\" là \"ổ cứng phụ nối với điều khiển IDE thứ hai\".\n"
"\n"
"Với các ổ đĩa SCSI, \"a\" là \"SCSI ID thấp nhất\", \"b\" là \"SCSI ID\n"
"thấp thứ nhì\", v.v..."
#: ../help.pm:88
#, fuzzy, c-format
msgid ""
"The Mageia installation is distributed on several CD-ROMs. If a\n"
"selected package is located on another CD-ROM, DrakX will eject the current\n"
"CD and ask you to insert the required one. If you do not have the requested\n"
"CD at hand, just click on \"%s\", the corresponding packages will not be\n"
"installed."
msgstr ""
"Việc cài đặt Mageia được phân phối trên vài đĩa CDROM. Nếu\n"
"một gói được chọn nằm trên CD khác, DrakX sẽ nhả CD hiện thời và yêu\n"
"cầu bạn nạp CD thích hợp. Nếu không có CD đó, hãy nhấn \"%s\", gói\n"
"tương ứng sẽ không được cài đặt."
#: ../help.pm:95
#, fuzzy, c-format
msgid ""
"It's now time to specify which programs you wish to install on your system.\n"
"There are thousands of packages available for Mageia, and to make it\n"
"simpler to manage, they have been placed into groups of similar\n"
"applications.\n"
"\n"
"Mageia sorts package groups in four categories. You can mix and\n"
"match applications from the various categories, so a ``Workstation''\n"
"installation can still have applications from the ``Server'' category\n"
"installed.\n"
"\n"
" * \"%s\": if you plan to use your machine as a workstation, select one or\n"
"more of the groups in the workstation category.\n"
"\n"
" * \"%s\": if you plan on using your machine for programming, select the\n"
"appropriate groups from that category. The special \"LSB\" group will\n"
"configure your system so that it complies as much as possible with the\n"
"Linux Standard Base specifications.\n"
"\n"
" Selecting the \"LSB\" group will ensure 100%%-LSB compliance\n"
"of the system. However, if you do not select the \"LSB\" group you will\n"
"still have a system which is nearly 100%% LSB-compliant.\n"
"\n"
" * \"%s\": if your machine is intended to be a server, select which of the\n"
"more common services you wish to install on your machine.\n"
"\n"
" * \"%s\": this is where you will choose your preferred graphical\n"
"environment. At least one must be selected if you want to have a graphical\n"
"interface available.\n"
"\n"
"Moving the mouse cursor over a group name will display a short explanatory\n"
"text about that group.\n"
"\n"
"You can check the \"%s\" box, which is useful if you're familiar with the\n"
"packages being offered or if you want to have total control over what will\n"
"be installed.\n"
"\n"
"If you start the installation in \"%s\" mode, you can deselect all groups\n"
"and prevent the installation of any new packages. This is useful for\n"
"repairing or updating an existing system.\n"
"\n"
"If you deselect all groups when performing a regular installation (as\n"
"opposed to an upgrade), a dialog will pop up suggesting different options\n"
"for a minimal installation:\n"
"\n"
" * \"%s\": install the minimum number of packages possible to have a\n"
"working graphical desktop.\n"
"\n"
" * \"%s\": installs the base system plus basic utilities and their\n"
"documentation. This installation is suitable for setting up a server.\n"
"\n"
" * \"%s\": will install the absolute minimum number of packages necessary\n"
"to get a working Linux system. With this installation you will only have a\n"
"command-line interface. The total size of this installation is about 65\n"
"megabytes."
msgstr ""
"Bây giờ là lúc chỉ ra chương trình nào mà bạn muốn cài đặt vào hệ thống.\n"
"Hiện có hàng nghìn gói tin dùng cho Mageia và được tổ chức theo\n"
"nhóm các ứng dụng giống nhau để dễ dàng quản lý.\n"
"\n"
"Các gói phần mềm được xếp loại theo các nhóm tương ứng với việc sử dụng\n"
"cụ thể cho máy tính. Mageia có 4 kiểu cài đặt sẵn với nhiều loại gói "
"tin.\n"
"Bạn có thể chọn dùng các ứng dụng pha trộn của các kiểu cài đặt này, ví dụ\n"
"như cài đặt kiểu ``Máy trạm'' cùng với việc cài các ứng dụng của kiểu cài\n"
"đặt ``Máy chủ''.\n"
"\n"
" * \"%s\": nếu định dùng máy tính này thành một trạm làm việc,\n"
"hãy chọn một hay nhiều ứng dụng của kiểu cài đặt máy trạm.\n"
"\n"
" * \"%s\": nếu định sử dụng máy này để lập trình, hãy chọn các gói\n"
"mong muốn từ kiểu cài đặt này. Nhóm \"LSB\" sẽ cấu hình hệ thống\n"
"sao cho việc biên dịch tuân theo mọi đặc điểm của Linux Standard\n"
"Base.\n"
"\n"
" Chọn nhóm \"LSB\" sẽ cài đặt kernel \"2.4\" thay vì kernel mặc định là\n"
"\"2.6\". Điều này đảm bảo hệ thống tương thích LBS 100%%. Dù sao, nếu\n"
"không chọn nhóm này thì bạn cũng vẫn có một hệ thống gần như tương\n"
"thích hoàn toàn với LSB.\n"
"\n"
" * \"%s\": nếu muốn dùng máy này làm máy chủ, hãy chọn các dịch vụ\n"
"thông dụng mà bạn muốn cài đặt lên máy tính này.\n"
"\n"
" * \"%s\": đây là nơi bạn sẽ chọn môi trường đồ họa ưa thích.\n"
"Cần chọn ít nhất một môi trường nếu muốn dùng giao diện đồ họa.\n"
"\n"
"Việc hơ con trỏ chuột lên tên nhóm sẽ làm xuất hiện đoạn chú giải vắn\n"
"tắt về nhóm đó.\n"
"\n"
"Có thể chọn \"%s\" nếu bạn biết rõ các gói tin hay khi bạn muốn kiểm\n"
"soát toàn bộ việc cài đặt các gói.\n"
"\n"
"Nếu cài đặt theo chế độ \"%s\", bạn có thể bỏ chọn toàn bộ các nhóm\n"
"và không cho cài đặt các gói mới. Nó thích hợp cho việc sửa chữa hay\n"
"cập nhật hệ thống sẵn có.\n"
"\n"
"Nếu bạn bỏ chọn toàn bộ các nhóm khi thực hiện cài đặt thường quy\n"
"(ngược lại với việc nâng cấp), một hộp thoại sẽ bật lên để gợi ý các tùy\n"
"chọn khác nhau cho việc cài đặt tối thiểu:\n"
"\n"
" * \"%s\": thực hiện cài đặt tối thiểu các gói tin mà để có một màn hình\n"
"nền đồ họa làm việc.\n"
"\n"
" * \"%s\": cài đặt một hệ thống cơ bản cộng thêm các\n"
"tiện ích cơ bản cùng với tài liệu của chúng. Việc cài đặt này thích hợp \n"
"cho việc thiết lập một máy chủ.\n"
"\n"
" * \"%s\": sẽ cài đặt thật sự tối thiểu nhất các gói\n"
"cho một hệ thống Linux hoạt động chỉ với giao diện dòng lệnh. Kích thước\n"
"cho kiểu cài đặt này là\n"
"65 MB."
#: ../help.pm:149 ../help.pm:591
#, c-format
msgid "Upgrade"
msgstr "Nâng cấp"
#: ../help.pm:149
#, c-format
msgid "With basic documentation"
msgstr "Kèm tài liệu cơ bản"
#: ../help.pm:149
#, c-format
msgid "Truly minimal install"
msgstr "Cài đặt thật tối thiểu"
#: ../help.pm:152
#, fuzzy, c-format
msgid ""
"If you choose to install packages individually, the installer will present\n"
"a tree containing all packages classified by groups and subgroups. While\n"
"browsing the tree, you can select entire groups, subgroups, or individual\n"
"packages.\n"
"\n"
"Whenever you select a package on the tree, a description will appear on the\n"
"right to let you know the purpose of that package.\n"
"\n"
"!! If a server package has been selected, either because you specifically\n"
"chose the individual package or because it was part of a group of packages,\n"
"you'll be asked to confirm that you really want those servers to be\n"
"installed. By default Mageia will automatically start any installed\n"
"services at boot time. Even if they are safe and have no known issues at\n"
"the time the distribution was shipped, it is entirely possible that\n"
"security holes were discovered after this version of Mageia was\n"
"finalized. If you do not know what a particular service is supposed to do "
"or\n"
"why it's being installed, then click \"%s\". Clicking \"%s\" will install\n"
"the listed services and they will be started automatically at boot time. !!\n"
"\n"
"The \"%s\" option is used to disable the warning dialog which appears\n"
"whenever the installer automatically selects a package to resolve a\n"
"dependency issue. Some packages depend on others and the installation of\n"
"one particular package may require the installation of another package. The\n"
"installer can determine which packages are required to satisfy a dependency\n"
"to successfully complete the installation.\n"
"\n"
"The tiny floppy disk icon at the bottom of the list allows you to load a\n"
"package list created during a previous installation. This is useful if you\n"
"have a number of machines that you wish to configure identically. Clicking\n"
"on this icon will ask you to insert the floppy disk created at the end of\n"
"another installation. See the second tip of the last step on how to create\n"
"such a floppy."
msgstr ""
"Nếu bạn đã yêu cầu trình cài đặt là bạn muốn tự chọn thêm các gói tin,\n"
"bạn sẽ thấy một cây chứa toàn bộ các gói xếp loại theo nhóm và nhóm\n"
"con. Trong khi duyệt cây này, bạn có thể chọn toàn bộ các nhóm, nhóm\n"
"con, hay các gói chọn riêng.\n"
"\n"
"Bất kỳ khi nào bạn chọn một gói tin trên cây, một thuyết minh sẽ xuất\n"
"hiện từ phải sang trái để cho bạn biết công dụng của gói đó.\n"
"\n"
"!! Nếu các gói tin cho server được chọn cố tình hoặc do nó là thành\n"
"phần của một nhóm, bạn sẽ được hỏi để khẳng định là bạn thật sự\n"
"muốn những server này được cài đặt. Trong Mageia, bất kỳ\n"
"server đã được cài đặt nào đều chạy vào lúc khởi động theo mặc định.\n"
"Thậm chí được coi là an toàn tại thời điểm phát hành, nó vẫn có thể\n"
"có lỗ hổng bảo mật được phát hiện sau khi phát hành phiên bản Mandriva\n"
"Linux. Nếu không biết một dịch vụ nào đó được dùng để làm gì\n"
"hay tại sao lại được cài đặt, hãy nhấn \"%s\". Nhấn \"%s\" sẽ cài\n"
"đặt các dịch vụ được liệt kê và chúng sẽ khởi chạy tự động theo\n"
"mặc định. !!\n"
"\n"
"Tùy chọn \"%s\" đơn giản là để không xuất hiện hộp thoại cảnh báo khi\n"
"chương trình cài đặt tự động chọn gói tin để giải quyết phụ thuộc.\n"
"Một số gói có liên quan với nhau như việc cài đặt gói này yêu cầu một\n"
"số chương trình đã phải được cài đặt. Trình cài đặt sẽ xác định những\n"
"gói nào cần có để thỏa mãn vấn đề phụ thuộc nhằm mục đính hoàn thành\n"
"quá trình cài đặt.\n"
"\n"
"Biểu tượng đĩa mềm nhỏ nằm ở bên dưới danh sách cho phép nạp danh\n"
"sách các gói tin được chọn trong lần cài đặt trước. Việc này có ích khi\n"
"bạn có nhiều máy tính và muốn cấu hình chúng giống nhau. Nhấn lên biểu\n"
"tượng này sẽ yêu cầu bạn nạp đĩa mềm được tạo từ lần cài đặt trước, tại\n"
"giai đoạn cuối. Hãy xem lời khuyên thứ hai của bước cuối cùng về cách tạo\n"
"một đĩa mềm như vậy."
#: ../help.pm:183
#, c-format
msgid "Automatic dependencies"
msgstr "Các phụ thuộc tự động"
#: ../help.pm:185
#, c-format
msgid ""
"This dialog is used to select which services you wish to start at boot\n"
"time.\n"
"\n"
"DrakX will list all services available on the current installation. Review\n"
"each one of them carefully and uncheck those which are not needed at boot\n"
"time.\n"
"\n"
"A short explanatory text will be displayed about a service when it is\n"
"selected. However, if you're not sure whether a service is useful or not,\n"
"it is safer to leave the default behavior.\n"
"\n"
"!! At this stage, be very careful if you intend to use your machine as a\n"
"server: you probably do not want to start any services which you do not "
"need.\n"
"Please remember that some services can be dangerous if they're enabled on a\n"
"server. In general, select only those services you really need. !!"
msgstr ""
"Hộp thoại này dùng để chọn khởi chạy dịch vụ nào bạn muốn khi khởi\n"
"động hệ thống.\n"
"\n"
"DrakX sẽ liệt kê mọi dịch vụ hiện có của cài đặt hiện hành. Hãy xem xét "
"thận\n"
"trọng từng dịch vụ và bỏ chọn những gì không cần lúc khởi động.\n"
"\n"
"Bạn có thể nhận được một đoạn chú giải ngắn về dịch vụ khi chọn. Tuy\n"
"nhiên, nếu không biết rõ dịch vụ đó có hữu ích hay không, để an toàn,\n"
"hãy để theo mặc định.\n"
"\n"
"!! Thật thận trọng ở bước này nếu bạn định dùng máy này làm máy\n"
"chủ: có thể bạn sẽ không muốn khởi chạy các dịch vụ không cần đến.\n"
"Nên nhớ là một số dịch vụ có thể gây nguy hiểm khi chúng được chạy\n"
"trên máy chủ. Nói chung, chỉ chọn các dịch vụ thực sự cần thiết. !!"
#: ../help.pm:209
#, c-format
msgid ""
"GNU/Linux manages time in GMT (Greenwich Mean Time) and translates it to\n"
"local time according to the time zone you selected. If the clock on your\n"
"motherboard is set to local time, you may deactivate this by unselecting\n"
"\"%s\", which will let GNU/Linux know that the system clock and the\n"
"hardware clock are in the same time zone. This is useful when the machine\n"
"also hosts another operating system.\n"
"\n"
"The \"%s\" option will automatically regulate the system clock by\n"
"connecting to a remote time server on the Internet. For this feature to\n"
"work, you must have a working Internet connection. We recommend that you\n"
"choose a time server located near you. This option actually installs a time\n"
"server which can be used by other machines on your local network as well."
msgstr ""
"GNU/Linux quản lý thời gian theo GMT (Greenwich Mean Time) và chuyển\n"
"thành giờ địa phương tùy theo múi giờ bạn chọn. Nếu đồng hồ trong máy\n"
"bạn đặt theo giờ địa phương, bạn có thể bất hoạt điều này bằng việc\n"
"thôi chọn \"%s\", nó sẽ làm cho GNU/Linux biết đồng hồ trong máy và\n"
"đồng hồ hệ thống là cùng múi giờ. Việc này hữu ích máy tính cũng chứa\n"
"một hệ điều hành khác như là Windows.\n"
"\n"
"Tùy chọn \"%s\" sẽ tự động điều chỉnh đồng hồ bằng cách nối với một máy\n"
"chủ thời gian ở xa trên Internet. Trong danh sách hiển thị, hãy chọn\n"
"một máy chủ ở gần bạn. Tất nhiên, bạn phải có một kết nối Internet để\n"
"cho tính năng này hoạt động. Thực tế là nó sẽ cài đặt một máy chủ thời\n"
"gian lên máy tính này để các máy khác trong mạng cục bộ tùy ý sử dụng."
#: ../help.pm:213
#, c-format
msgid "Hardware clock set to GMT"
msgstr ""
#: ../help.pm:213
#, c-format
msgid "Automatic time synchronization"
msgstr "Tự động đồng bộ hóa thời gian"
#: ../help.pm:223
#, c-format
msgid ""
"Graphic Card\n"
"\n"
" The installer will normally automatically detect and configure the\n"
"graphic card installed on your machine. If this is not correct, you can\n"
"choose from this list the card you actually have installed.\n"
"\n"
" In the situation where different servers are available for your card,\n"
"with or without 3D acceleration, you're asked to choose the server which\n"
"best suits your needs."
msgstr ""
"Card Đồ Họa\n"
"\n"
" Bình thường, trình cài đặt có khả năng tự động phát hiện và cấu\n"
"cấu hình card đồ họa có trong máy tính. Nếu không được vậy, bạn\n"
"có thể chọn nó trong danh sách này.\n"
"\n"
" Trong trường hợp có server khác sẵn dùng cho card này, có hoặc\n"
"không có tăng tốc 3D, bạn sẽ được đề nghị chọn server thích hợp nhất\n"
"cho nhu cầu của bạn."
#: ../help.pm:234
#, fuzzy, c-format
msgid ""
"X (for X Window System) is the heart of the GNU/Linux graphical interface\n"
"on which all the graphical environments (KDE, GNOME, AfterStep,\n"
"WindowMaker, etc.) bundled with Mageia rely upon.\n"
"\n"
"You'll see a list of different parameters to change to get an optimal\n"
"graphical display.\n"
"\n"
"Graphic Card\n"
"\n"
" The installer will normally automatically detect and configure the\n"
"graphic card installed on your machine. If this is not correct, you can\n"
"choose from this list the card you actually have installed.\n"
"\n"
" In the situation where different servers are available for your card,\n"
"with or without 3D acceleration, you're asked to choose the server which\n"
"best suits your needs.\n"
"\n"
"\n"
"\n"
"Monitor\n"
"\n"
" Normally the installer will automatically detect and configure the\n"
"monitor connected to your machine. If it is not correct, you can choose\n"
"from this list the monitor which is connected to your computer.\n"
"\n"
"\n"
"\n"
"Resolution\n"
"\n"
" Here you can choose the resolutions and color depths available for your\n"
"graphics hardware. Choose the one which best suits your needs (you will be\n"
"able to make changes after the installation). A sample of the chosen\n"
"configuration is shown in the monitor picture.\n"
"\n"
"\n"
"\n"
"Test\n"
"\n"
" Depending on your hardware, this entry might not appear.\n"
"\n"
" The system will try to open a graphical screen at the desired\n"
"resolution. If you see the test message during the test and answer \"%s\",\n"
"then DrakX will proceed to the next step. If you do not see it, then it\n"
"means that some part of the auto-detected configuration was incorrect and\n"
"the test will automatically end after 12 seconds and return you to the\n"
"menu. Change settings until you get a correct graphical display.\n"
"\n"
"\n"
"\n"
"Options\n"
"\n"
" This steps allows you to choose whether you want your machine to\n"
"automatically switch to a graphical interface at boot. Obviously, you may\n"
"want to check \"%s\" if your machine is to act as a server, or if you were\n"
"not successful in getting the display configured."
msgstr ""
"X (cho hệ thống cửa sổ X) là trái tim của giao diện đồ họa GNU/Linux\n"
"mà trên đó mọi môi trường đồ họa (KDE, GNOME, AfterStep,\n"
"WindowMaker, etc.) được kết hợp trong Mageia.\n"
"\n"
"Bạn sẽ được xem danh sách các tham số khác nhau để thay đổi sao\n"
"cho việc hiển thị đồ họa được tối ưu.\n"
"\n"
"Card đồ họa\n"
"\n"
" Trình cài đặt thông thường sẽ tự động phát hiện và cấu hình card\n"
"đồ họa có trong máy. Nếu không được như vậy, bạn có thể chọn\n"
"cái bạn thật sự có trong danh sách này.\n"
"\n"
" Trong trường hợp có các server khác nhau cho card của bạn, có hay\n"
"không có tăng tốc 3D, bạn sẽ được đề nghị chọn server nào mà thích\n"
"hợp nhất với nhu cầu của bạn.\n"
"\n"
"\n"
"\n"
"Monitor\n"
"\n"
" Trình cài đặt thông thường sẽ tự động phát hiện và cấu hình monitor\n"
"nối với máy của bạn. Nếu không được như vậy, bạn có thể chọn trong\n"
"danh sách này cái mà bạn thật sự có.\n"
"\n"
"\n"
"\n"
"Độ phân giải\n"
"\n"
" Bạn có thể chọn ở đây độ phân giải và độ sâu màu trong số những cái\n"
"hiện có cho phần cứng của bạn. Hãy chọ một cái phù hợp nhất với nhu\n"
"cầu của bạn (và có thể thay đổi sau khi cài đặt. Ví dụ về cấu hình được\n"
"chọn hiển thị trên monitor.\n"
"\n"
"\n"
"\n"
"Chạy thử\n"
"\n"
" Hệ thống sẽ mở một màn hình đồ hoạ với độ phân giải mong muốn.\n"
"Nếu bạn nhìn thấy thông điệp trong khi chạy thử và trả lời \"%s\", thì\n"
"DrakX sẽ thực hiện bước tiếp theo. Nếu bạn không nhìn thấy, nghĩa là\n"
"một số phần nào đó của cấu hình được phát hiện tự động đã không\n"
"đúng và việc chạy thử sẽ tự kết thúc sau 12 giây, đưa bạn trở về với\n"
"menu. Hãy thay đổi các thiết lập tới khi bạn nhận hiển thị đồ họa đúng.\n"
"\n"
"\n"
"\n"
"Các tùy chọn\n"
"\n"
" Tại đây có thể chọn việc máy tính của bạn tự động chuyển vào giao\n"
"diện đồ họa khi khởi động hay không. Hiển nhiên là bạn muốn chọn\n"
"\"%s\" nếu bạn dùng máy này làm máy chủ, hay khi bạn đã không\n"
"thành công trong việc cấu hình hiển thị đồ họa."
#: ../help.pm:291
#, c-format
msgid ""
"Monitor\n"
"\n"
" Normally the installer will automatically detect and configure the\n"
"monitor connected to your machine. If it is not correct, you can choose\n"
"from this list the monitor which is connected to your computer."
msgstr ""
"Monitor\n"
"\n"
" Thông thường, trình cài đặt có khả năng tự động phát hiện và cấu hình\n"
"monitor nối với máy tính. Nếu không được vậy, bạn có thể chọn trong\n"
"danh sách monitor cho cái bạn có."
#: ../help.pm:298
#, c-format
msgid ""
"Resolution\n"
"\n"
" Here you can choose the resolutions and color depths available for your\n"
"graphics hardware. Choose the one which best suits your needs (you will be\n"
"able to make changes after the installation). A sample of the chosen\n"
"configuration is shown in the monitor picture."
msgstr ""
"Độ phân giải\n"
"\n"
" Tại đây có thể chọn các độ phân giải và độ sâu màu sẵn có cho\n"
"phần cứng bạn có. Hãy chọn cái thích hợp nhất với nhu cầu của bạn\n"
"(và có thể thay đổi lại sau khi cài đặt). Ví dụ về cấu hình được chọn\n"
"sẽ hiển thị trên monitor."
#: ../help.pm:306
#, c-format
msgid ""
"In the situation where different servers are available for your card, with\n"
"or without 3D acceleration, you're asked to choose the server which best\n"
"suits your needs."
msgstr ""
"Trong trường hợp có các server khác dùng được cho card của bạn, có\n"
"hay không có tăng tốc 3D, bạn sẽ được đề nghị chọn server nào thích\n"
"hợp nhất cho nhu cầu của bạn."
#: ../help.pm:311
#, c-format
msgid ""
"Options\n"
"\n"
" This steps allows you to choose whether you want your machine to\n"
"automatically switch to a graphical interface at boot. Obviously, you may\n"
"want to check \"%s\" if your machine is to act as a server, or if you were\n"
"not successful in getting the display configured."
msgstr ""
"Tùy chọn\n"
"\n"
"...Tại đây, bạn có thể chọn việc hệ thống tự khởi động vào giao diện\n"
"đồ họa. Hiển nhiên, bạn muốn trả lời \"%s\" nếu máy của bạn hoạt động\n"
"như một máy chủ, hay khi bạn không thành công trong việc cấu hình hiển\n"
"thị."
#: ../help.pm:319
#, fuzzy, c-format
msgid ""
"You now need to decide where you want to install the Mageia\n"
"operating system on your hard disk drive. If your hard disk drive is empty or if an\n"
"existing operating system is using all the available space you will have to\n"
"partition the drive. Basically, partitioning a hard disk drive means to\n"
"logically divide it to create the space needed to install your new\n"
"Mageia system.\n"
"\n"
"Because the process of partitioning a hard disk drive is usually irreversible\n"
"and can lead to data losses, partitioning can be intimidating and stressful\n"
"for the inexperienced user. Fortunately, DrakX includes a wizard which\n"
"simplifies this process. Before continuing with this step, read through the\n"
"rest of this section and above all, take your time.\n"
"\n"
"Depending on the configuration of your hard disk drive, several options are\n"
"available:\n"
"\n"
" * \"%s\". This option will perform an automatic partitioning of your blank\n"
"drive(s). If you use this option there will be no further prompts.\n"
"\n"
" * \"%s\". The wizard has detected one or more existing Linux partitions on\n"
"your hard disk drive. If you want to use them, choose this option. You will then\n"
"be asked to choose the mount points associated with each of the partitions.\n"
"The legacy mount points are selected by default, and for the most part it's\n"
"a good idea to keep them.\n"
"\n"
" * \"%s\". If Microsoft Windows is installed on your hard disk drive and takes\n"
"all the space available on it, you will have to create free space for\n"
"GNU/Linux. To do so, you can delete your Microsoft Windows partition and\n"
"data (see ``Erase entire disk'' solution) or resize your Microsoft Windows\n"
"FAT or NTFS partition. Resizing can be performed without the loss of any\n"
"data, provided you've previously defragmented the Windows partition.\n"
"Backing up your data is strongly recommended. Using this option is\n"
"recommended if you want to use both Mageia and Microsoft Windows on\n"
"the same computer.\n"
"\n"
" Before choosing this option, please understand that after this\n"
"procedure, the size of your Microsoft Windows partition will be smaller\n"
"than when you started. You'll have less free space under Microsoft Windows\n"
"to store your data or to install new software.\n"
"\n"
" * \"%s\". If you want to delete all data and all partitions present on\n"
"your hard disk drive and replace them with your new Mageia system, choose\n"
"this option. Be careful, because you will not be able to undo this "
"operation\n"
"after you confirm.\n"
"\n"
" !! If you choose this option, all data on your disk will be deleted. !!\n"
"\n"
" * \"%s\". This option appears when the hard disk drive is entirely taken by\n"
"Microsoft Windows. Choosing this option will simply erase everything on the\n"
"drive and begin fresh, partitioning everything from scratch.\n"
"\n"
" !! If you choose this option, all data on your disk will be lost. !!\n"
"\n"
" * \"%s\". Choose this option if you want to manually partition your hard\n"
"drive. Be careful -- it is a powerful but dangerous choice and you can very\n"
"easily lose all your data. That's why this option is really only\n"
"recommended if you have done something like this before and have some\n"
"experience. For more instructions on how to use the DiskDrake utility,\n"
"refer to the ``Managing Your Partitions'' section in the ``Starter Guide''."
msgstr ""
"Lúc này bạn cần chọn nơi nào trên đĩa cứng sẽ cài đặt hệ điều hành\n"
"Mageia. Nếu như đĩa cứng chưa có gì hoặc nếu đã có một hệ\n"
"điều hành đang sử dụng toàn bộ không gian đĩa, bạn cần thực hiện việc\n"
"phân vùng đĩa. Về cơ bản, việc phân vùng một ổ đĩa cứng là phân chia\n"
"các ổ lý luận, tạo không gian để cài đặt hệ thống Mageia mới.\n"
"\n"
"Do kết quả của quá trình phân vùng thường không thay đổi lại được nữa,\n"
"nên việc phân vùng có thể gây sợ hãi và căng thẳng nếu bạn không phải\n"
"người dùng có kinh nghiệm. May thay, DrakX đã có đồ thuật đơn giản hoá\n"
"việc này. Trước khi bắt đầu, hãy đọc phần hướng dẫn dưới đây và trên hết\n"
"là đừng vội vàng.\n"
"\n"
"Tùy thuộc vào cấu hình của đĩa cứng, sẵn có một số tùy chọn như sau:\n"
"\n"
" * \"%s\": tùy chọn này sẽ tiến hành tự động việc\n"
"phân vùng cho đĩa trống. Bạn sẽ không bị nhắc là phải làm gì nữa nếu\n"
"dùng tùy chọn này.\n"
"\n"
" * \"%s\": đồ thuật đã phát hiện thấy một hoặc nhiều\n"
"phân vùng Linux hiện có trên đĩa cứng. Nếu muốn dùng chúng, hãy dùng\n"
"tùy chọn này. Bạn sẽ được hỏi về các điểm gắn kết cho từng phân vùng.\n"
"Các điểm gắn kết kế tục được chọn theo mặc định và trong hầu hết các\n"
"trường hợp, bạn nên giữ chúng.\n"
"\n"
" * \"%s\": nếu Windows đã\n"
"được cài đặt trên đĩa cứng và dùng toàn bộ không gian đĩa, bạn cần tạo\n"
"không gian trống cho Linux. Để làm việc đó, bạn có thể xóa bỏ dữ liệu và\n"
"phân vùng của Microsoft Windows (xem giải pháp ``Xóa toàn bộ đĩa'') hoặc\n"
"lập lại kích thước phân vùng của MS Windows mà có thể không bị mất bất\n"
"kỳ dữ liệu nào. Tuy nhiên bạn rất nên thực hiện việc sao lưu dữ liệu trước "
"đã.\n"
"Nên chọn giải pháp này nếu muốn dùng cả Mageia và Windows trên\n"
"cùng một máy tính.\n"
"\n"
" Trước khi chọn tùy chọn này, hãy hiểu là sau khi thực hiện cách này,\n"
"kích thước phân vùng của MS Windows sẽ nhỏ hơn so với lúc này.\n"
"Sẽ có ít không gian trống hơn trong Microsoft Windows để lưu dữ\n"
"liệu và cài đặt phần mềm mới.\n"
"\n"
" * \"%s\": nếu muốn xoá toàn bộ dữ liệu và các phân vùng\n"
"hiện có trên ổ cứng và thay thế bằng hệ thống Mageia mới,\n"
"hãy dùng tùy chọn này. Hãy thận trọng với tùy chọn này vì sẽ không\n"
"thể thay đổi lựa chọn sau khi đã khẳng định.\n"
"\n"
" !! Nếu chọn tùy chọn này, toàn bộ dữ liệu trên đĩa sẽ mất. !!\n"
"\n"
" * \"%s\": đơn giản là sẽ xoá sạch mọi thứ có trên\n"
"đĩa, làm sạch, phân vùng mọi thứ từ đầu. Mọi dữ liệu trên đĩa sẽ\n"
"bị mất.\n"
"\n"
" !! Nếu chọn tùy chọn này, mọi dữ liệu trên đĩa sẽ mất. !!\n"
"\n"
" * \"%s\": dùng tùy chọn này khi bạn muốn tự phân\n"
"vùng đĩa cứng. Hãy cẩn thận - đây là tùy chọn mạnh nhưng nguy hiểm, rất\n"
"dễ bị mất mọi dữ liệu. Vì vậy, không nên chọn chế độ này trừ khi trước\n"
"đây bạn đã từng thực hiện và đã có kinh nghiệm."
#: ../help.pm:377
#, c-format
msgid "Use existing partition"
msgstr "Dùng phân vùng hiện thời"
#: ../help.pm:370
#, c-format
msgid "Use the free space on the Microsoft Windows® partition"
msgstr ""
#: ../help.pm:370
#, c-format
msgid "Erase entire disk"
msgstr "Xoá toàn bộ đĩa"
#: ../help.pm:380
#, c-format
msgid ""
"There you are. Installation is now complete and your GNU/Linux system is\n"
"ready to be used. Just click on \"%s\" to reboot the system. Do not forget\n"
"to remove the installation media (CD-ROM or floppy). The first thing you\n"
"should see after your computer has finished doing its hardware tests is the\n"
"boot-loader menu, giving you the choice of which operating system to start.\n"
"\n"
"The \"%s\" button shows two more buttons to:\n"
"\n"
" * \"%s\": enables you to create an installation floppy disk which will\n"
"automatically perform a whole installation without the help of an operator,\n"
"similar to the installation you've just configured.\n"
"\n"
" Note that two different options are available after clicking on that\n"
"button:\n"
"\n"
" * \"%s\". This is a partially automated installation. The partitioning\n"
"step is the only interactive procedure.\n"
"\n"
" * \"%s\". Fully automated installation: the hard disk is completely\n"
"rewritten, all data is lost.\n"
"\n"
" This feature is very handy when installing on a number of similar\n"
"machines. See the Auto install section on our web site for more\n"
"information.\n"
"\n"
" * \"%s\"(*): saves a list of the packages selected in this installation.\n"
"To use this selection with another installation, insert the floppy and\n"
"start the installation. At the prompt, press the [F1] key, type >>linux\n"
"defcfg=\"floppy\"<< and press the [Enter] key.\n"
"\n"
"(*) You need a FAT-formatted floppy. To create one under GNU/Linux, type\n"
"\"mformat a:\", or \"fdformat /dev/fd0\" followed by \"mkfs.vfat\n"
"/dev/fd0\"."
msgstr ""
"Chúc mừng. Việc cài đặt đã hoàn thành và hệ thống GNU/Linux sẵn sàng\n"
"để sử dụng. Hãy nhấn \"%s\" để khởi động lại hệ thống. Cái đầu tiên mà\n"
"bạn thấy sau khi kết thúc việc kiểm tra phần cứng sẽ là menu của trình\n"
"nạp khởi động, nó cho bạn chọn hệ điều hành nào sẽ khởi động.\n"
"\n"
"Nút \"%s\" hiển thị thêm 2 nút để:\n"
"\n"
" * \"%s\": để tạo một đĩa mềm cài đặt nhờ đó\n"
"sẽ tự động thực hiện toàn bộ quá trình cài đặt mà không cần có người\n"
"thực hiện, giống hệt như quá trình cài đặt mà bạn vừa tiến hành.\n"
"\n"
" Lưu ý: sẽ có 2 tùy chọn khác nhau sau khi nhấn chuột lên nút:\n"
"\n"
" * \"%s\". là quá trình cài đặt tự động từng phần. Chỉ còn\n"
"bước phân vùng là còn phải tương tác.\n"
"\n"
" * \"%s\". Cài đặt hoàn toàn tự động: đĩa cứng được ghi lại\n"
"hoàn toàn, mọi dữ liệu bị mất.\n"
"\n"
" Tính năng này rất thuận tiện khi thực hiện cài đặt cho một số lượng\n"
"lớn các máy giống nhau. Xem Phần cài đặt tự động tại website của hãng.\n"
"\n"
" * \"%s\"(*) : lưu lại danh sách các gói được chọn của quá trình cài đặt\n"
"này. Để dùng việc chọn này cho lần cài đặt khác, hãy nạp đĩa mềm vào ổ\n"
"và bắt đầu chạy quá trình cài đặt. Tại dấu nhắc, nhấn phím [F1] và gõ\n"
">>linux defcfg=\"floppy\"<<.\n"
"\n"
"(*) Bạn cần một đĩa mềm được định dạng FAT. Để tạo nó trong GNU/Linux,\n"
"gõ \"mformat a:\", hay \"fdformat /dev/fd0\" rồi đến \"mkfs.vfat\n"
"/dev/fd0\"."
#: ../help.pm:412
#, c-format
msgid "Generate auto-install floppy"
msgstr "Tạo đĩa mềm cài đặt tự động"
#: ../help.pm:405
#, c-format
msgid "Replay"
msgstr ""
#: ../help.pm:405
#, c-format
msgid "Automated"
msgstr ""
#: ../help.pm:405
#, c-format
msgid "Save packages selection"
msgstr ""
#: ../help.pm:408
#, fuzzy, c-format
msgid ""
"If you chose to reuse some legacy GNU/Linux partitions, you may wish to\n"
"reformat some of them and erase any data they contain. To do so, please\n"
"select those partitions as well.\n"
"\n"
"Please note that it's not necessary to reformat all pre-existing\n"
"partitions. You must reformat the partitions containing the operating\n"
"system (such as \"/\", \"/usr\" or \"/var\") but you do not have to "
"reformat\n"
"partitions containing data that you wish to keep (typically \"/home\").\n"
"\n"
"Please be careful when selecting partitions. After the formatting is\n"
"completed, all data on the selected partitions will be deleted and you\n"
"will not be able to recover it.\n"
"\n"
"Click on \"%s\" when you're ready to format the partitions.\n"
"\n"
"Click on \"%s\" if you want to choose another partition for your new\n"
"Mageia operating system installation.\n"
"\n"
"Click on \"%s\" if you wish to select partitions which will be checked for\n"
"bad blocks on the disk."
msgstr ""
"Nếu chọn dùng lại một số phân vùng linux sẵn có, bạn có thể muốn format\n"
"lại và xóa dữ liệu trên một số phân vùng đó. Để thực hiện, hãy chọn chúng.\n"
"\n"
" Hãy lưu ý là không nhất thiết phải format lại mọi phân vùng có sẵn từ "
"trước.\n"
"Bạn phải format lại các phân vùng chứa hệ điều hành (như là : \"/\", \"/usr"
"\"\n"
"hay \"/var\") nhưng không phải làm việc này đối với các phân vùng có dữ\n"
"liệu mà bạn muốn giữ (điển hình là \"/home\").\n"
"\n"
"Hãy thận trọng khi chọn các phân vùng. Sau khi format, mọi dữ liệu\n"
"trên đó sẽ bị xóa và sẽ không có cách nào để khôi phục lại chúng\n"
"nữa\n"
"\n"
"Nhấn lên \"%s\" khi bạn sẵn sàng format các phân vùng.\n"
"\n"
"Nhấn lên \"%s\" nếu muốn chọn một phân vùng khác cho việc\n"
"cài đặt hệ điều hành Mageia mới.\n"
"\n"
"Nhấn lên \"%s\" nếu muốn chọn các phân vùng sẽ được kiểm\n"
"tra các khối bị hỏng trên bề mặt đĩa."
#: ../help.pm:437
#, fuzzy, c-format
msgid ""
"By the time you install Mageia, it's likely that some packages will\n"
"have been updated since the initial release. Bugs may have been fixed,\n"
"security issues resolved. To allow you to benefit from these updates,\n"
"you're now able to download them from the Internet. Check \"%s\" if you\n"
"have a working Internet connection, or \"%s\" if you prefer to install\n"
"updated packages later.\n"
"\n"
"Choosing \"%s\" will display a list of web locations from which updates can\n"
"be retrieved. You should choose one near to you. A package-selection tree\n"
"will appear: review the selection, and press \"%s\" to retrieve and install\n"
"the selected package(s), or \"%s\" to abort."
msgstr ""
"Vào lúc bạn đang cài đặt Mageia, có thể đã có một số gói tin\n"
"đã được cập nhật kể từ lúc phát hành phiên bản này. Một số lỗi chương\n"
"trình đã được sửa, các vấn đề bảo mật được giải quyết. Để cho bạn\n"
"được hưởng lợi từ các cập nhật này, bây giờ bạn có thể để tải chúng về\n"
"từ internet. Chọn \"%s\" nếu bạn có kết nối Intertnet hoạt động, hoặc\n"
"\"%s\" nếu bạn muốn cài đặt các gói tin cập nhật sau này.\n"
"\n"
"Chọn \"%s\" sẽ hiển thị danh sách những nơi bạn có thể thu thập các\n"
"cập nhật. Hãy chọn nơi gần bạn nhất. Sẽ xuất hiện một cây chứa các\n"
"gói để chọn, hãy xem qua nội dung rồi nhấn \"%s\" để lấy về và cài\n"
"đặt những gói được chọn, hoặc nhấn \"%s\" để thôi cập nhật."
#: ../help.pm:450
#, fuzzy, c-format
msgid ""
"At this point, DrakX will allow you to choose the security level you desire\n"
"for your machine. As a rule of thumb, the security level should be set\n"
"higher if the machine is to contain crucial data, or if it's to be directly\n"
"exposed to the Internet. The trade-off that a higher security level is\n"
"generally obtained at the expense of ease of use.\n"
"\n"
"If you do not know what to choose, keep the default option. You'll be able\n"
"to change it later with the draksec tool, which is part of Mageia\n"
"Control Center.\n"
"\n"
"Fill the \"%s\" field with the e-mail address of the person responsible for\n"
"security. Security messages will be sent to that address."
msgstr ""
"Lúc này, DrakX cho phép bạn chọn mức bảo mật theo mong muốn cho\n"
"máy tính. Với một nguyên tắc chủ đạo: máy càng bị phơi bày nhiều trên\n"
"internet hoặc chứa dữ liệu quan trọng bao nhiêu thì mức độ bảo mật cần\n"
"phải cao bấy nhiêu. Tuy nhiên, mức độ bảo mật càng cao thì càng làm\n"
"giảm tính dễ sử dụng.\n"
"\n"
"Nếu không biết phải chọn mức độ nào, hãy giữ tùy chọn mặc định. Bạn\n"
"có thể thay đổi lại sau này bằng côngcụ draksec trong Trung Tâm Điều\n"
"Khiển Mandriva.\n"
"\n"
"Điền vào \"%s\" địa chỉ e-mail của người quản trị bảo mật. Thông báo\n"
"bảo mật sẽ được gửi tới địa chỉ này."
#: ../help.pm:461
#, c-format
msgid "Security Administrator"
msgstr "Người Quản Trị Bảo Mật:"
#: ../help.pm:464
#, fuzzy, c-format
msgid ""
"At this point, you need to choose which partition(s) will be used for the\n"
"installation of your Mageia system. If partitions have already been\n"
"defined, either from a previous installation of GNU/Linux or by another\n"
"partitioning tool, you can use existing partitions. Otherwise, hard disk drive\n"
"partitions must be defined.\n"
"\n"
"To create partitions, you must first select a hard disk drive. You can select\n"
"the disk for partitioning by clicking on ``hda'' for the first IDE drive,\n"
"``hdb'' for the second, ``sda'' for the first SCSI drive and so on.\n"
"\n"
"To partition the selected hard disk drive, you can use these options:\n"
"\n"
" * \"%s\": this option deletes all partitions on the selected hard disk drive\n"
"\n"
" * \"%s\": this option enables you to automatically create ext3 and swap\n"
"partitions in the free space of your hard disk drive\n"
"\n"
"\"%s\": gives access to additional features:\n"
"\n"
" * \"%s\": saves the partition table to a floppy. Useful for later\n"
"partition-table recovery if necessary. It is strongly recommended that you\n"
"perform this step.\n"
"\n"
" * \"%s\": allows you to restore a previously saved partition table from a\n"
"floppy disk.\n"
"\n"
" * \"%s\": if your partition table is damaged, you can try to recover it\n"
"using this option. Please be careful and remember that it does not always\n"
"work.\n"
"\n"
" * \"%s\": discards all changes and reloads the partition table that was\n"
"originally on the hard disk drive.\n"
"\n"
" * \"%s\": un-checking this option will force users to manually mount and\n"
"unmount removable media such as floppies and CD-ROMs.\n"
"\n"
" * \"%s\": use this option if you wish to use a wizard to partition your\n"
"hard disk drive. This is recommended if you do not have a good understanding of\n"
"partitioning.\n"
"\n"
" * \"%s\": use this option to cancel your changes.\n"
"\n"
" * \"%s\": allows additional actions on partitions (type, options, format)\n"
"and gives more information about the hard disk drive.\n"
"\n"
" * \"%s\": when you are finished partitioning your hard disk drive, this will\n"
"save your changes back to disk.\n"
"\n"
"When defining the size of a partition, you can finely set the partition\n"
"size by using the Arrow keys of your keyboard.\n"
"\n"
"Note: you can reach any option using the keyboard. Navigate through the\n"
"partitions using [Tab] and the [Up/Down] arrows.\n"
"\n"
"When a partition is selected, you can use:\n"
"\n"
" * Ctrl-c to create a new partition (when an empty partition is selected)\n"
"\n"
" * Ctrl-d to delete a partition\n"
"\n"
" * Ctrl-m to set the mount point\n"
"\n"
"To get information about the different filesystem types available, please\n"
"read the ext2FS chapter from the ``Reference Manual''.\n"
"\n"
"If you are installing on a PPC machine, you will want to create a small HFS\n"
"``bootstrap'' partition of at least 1MB which will be used by the yaboot\n"
"bootloader. If you opt to make the partition a bit larger, say 50MB, you\n"
"may find it a useful place to store a spare kernel and ramdisk images for\n"
"emergency boot situations."
msgstr ""
"Vào lúc này, bạn cần chọn những phân vùng nào sẽ được dùng để cài đặt\n"
"hệ thống Mageia. Nếu các phân vùng đã được xác lập từ lần cài\n"
"đặt GNU/Linux trước đó hay được tạo bằng một công cụ phân vùng khác,\n"
"bạn có thể dùng chúng. Nếu chưa có, bạn sẽ sẽ phải thực hiện việc hoạch\n"
"định các phân vùng.\n"
"\n"
"Để tạo các phân vùng, đầu tiên phải chọn một đĩa cứng. Có thể chọn đĩa\n"
"để phân vùng bằng cách nhấn lên ``hda'' đối với đĩa IDE đầu tiên, ``hdb'' "
"cho\n"
"đĩa thứ hai, ``sda'' đới với ổ SCSI đầu tiên và cứ tương tự như vậy.\n"
"\n"
"Để phân vùng cho đĩa cứng được chọn, có thể dùng những tùy chọn sau:\n"
"\n"
" * \"%s\": để xóa mọi phân vùng có trên đĩa cứng được chọn.\n"
"\n"
" * \"%s\": cho phép tự động tạo các phân vùng ext3 và swap\n"