Path translation
The Path translation module, part of the Internationalization (i18n) package, allows you to map together existing pages that are translations of each other. This will allow users to use the language switcher to navigate between the associated pages.
The module is meant to be used as a last resort to translate paths that can't otherwise be mapped together as translations. For example, paths to translated nodes can already be linked with the Content translation module and paths to translated taxonomy terms can be linked with the Taxonomy translation module. Path translations should be used to link generic paths, such as those provided by Views or Panels.
To set up translations of a particular path, you need to create a path translation set by going to Configuration > Regional and language > Translation sets > Paths and clicking Add path translation.

Figure 1

Figure 2
Compact language switcher
There is a snippet that can be used for language switching instead of the standard language switching block (see an example of page template code appended) - the point is (1) being more compact (e.g. you can insert the switcher into the page header next to the site name, slogan, or search box), and (2) hiding the current language. See #242646: Do not show a link to the current language D6
<?php
// this is copy&paste from locale_block in locale.module
$languages = language_list('enabled');
$links = array();
foreach ($languages[1] as $language) {
if ($language->language != $current) {
$links[$language->language] = array(
'href' => $_GET['q'],
'title' => $language->native,
'language' => $language,
'attributes' => array('class' => 'language-link'),
);
}
}
// this adds the real paths, i.e. if we are on a german page,
// the british flag will point to en/english_alias instead of
// en/node_with_german_content
translation_translation_link_alter($links, $_GET['q']);
// This one adds extended languages, i.e. those that are not enabled.
// Disable if you want only flags for enabled languages.
i18n_translation_link_alter($links, $_GET['q']);
// now add or replace text links by flags, according to your i18n settings.
if (function_exists('languageicons_translation_link_alter'))