*mlang.txt*     For Vim version 8.1.  Last change: 2019 May 05


		  VIM REFERENCE MANUAL    by Bram Moolenaar


Multi-language features				*multilang* *multi-lang*

This is about using messages and menus in various languages.  For editing
multi-byte text see |multibyte|.

The basics are explained in the user manual: |usr_45.txt|.

1. Messages			|multilang-messages|
2. Menus			|multilang-menus|
3. Scripts			|multilang-scripts|

Also see |help-translated| for multi-language help.

{not available when compiled without the |+multi_lang| feature}

==============================================================================
1. Messages						*multilang-messages*

Vim picks up the locale from the environment.  In most cases this means Vim
will use the language that you prefer, unless it's not available.

To see a list of supported locale names on your system, look in one of these
directories (for Unix):
	/usr/lib/locale ~
	/usr/share/locale ~
Unfortunately, upper/lowercase differences matter.  Also watch out for the
use of "-" and "_".

					    *:lan* *:lang* *:language* *E197*
:lan[guage]
:lan[guage] mes[sages]
:lan[guage] cty[pe]
:lan[guage] tim[e]
			Print the current language (aka locale).
			With the "messages" argument the language used for
			messages is printed.  Technical: LC_MESSAGES.
			With the "ctype" argument the language used for
			character encoding is printed.  Technical: LC_CTYPE.
			With the "time" argument the language used for
			strftime() is printed.  Technical: LC_TIME.
			Without argument all parts of the locale are printed
			(this is system dependent).
			The current language can also be obtained with the
			|v:lang|, |v:ctype| and |v:lc_time| variables.

:lan[guage] {name}
:lan[guage] mes[sages] {name}
:lan[guage] cty[pe] {name}
:lan[guage] tim[e] {name}
			Set the current language (aka locale) to {name}.
			The locale {name} must be a valid locale on your
			system.  Some systems accept aliases like "en" or
			"en_US", but some only accept the full specification
			like "en_US.ISO_8859-1".  On Unix systems you can use
			this command to see what locales are supported: >
				:!locale -a
<			With the "messages" argument the language used for
			messages is set.  This can be different when you want,
			for example, English messages while editing Japanese
			text.  This sets $LC_MESSAGES.
			With the "ctype" argument the language used for
			character encoding is set.  This affects the libraries
			that Vim was linked with.  It's unusual to set this to
			a different value from 'encoding' or "C".  This sets
			$LC_CTYPE.
			With the "time" argument the language used for time
			and date messages is set.  This affects strftime().
			This sets $LC_TIME.
			Without an argument both are set, and additionally
			$LANG is set.
			When compiled with the |+float| feature the LC_NUMERIC
			value will always be set to "C", so that floating
			point numbers use '.' as the decimal point.
			This will make a difference for items that depend on
			the language (some messages, time and date format).
			Not fully supported on all systems
			If this fails there will be an error message.  If it
			succeeds there is no message.  Example: >
				:language
				Current language: C
				:language de_DE.ISO_8859-1
				:language mes
				Current messages language: de_DE.ISO_8859-1
				:lang mes en
<

MS-WINDOWS MESSAGE TRANSLATIONS				*win32-gettext*

If you used the self-installing .exe file, message translations should work
already.  Otherwise get the libintl.dll file if you don't have it yet:

	http://sourceforge.net/projects/gettext
Or:
	https://mlocati.github.io/gettext-iconv-windows/

This also contains tools xgettext, msgformat and others.

libintl.dll should be placed in same directory as (g)vim.exe, or one of the
directories listed in the PATH environment value.  Vim also looks for the
alternate names "libintl-8.dll" and "intl.dll".

Message files (vim.mo) have to be placed in "$VIMRUNTIME/lang/xx/LC_MESSAGES",
where "xx" is the abbreviation of the language (mostly two letters).

If you write your own translations you need to generate the .po file and
convert it to a .mo file.  You need to get the source distribution and read
the file "src/po/README.txt".

To overrule the automatic choice of the language, set the $LANG variable to
the language of your choice.  use "en" to disable translations. >

  :let $LANG = 'ja'

(text for Windows by Muraoka Taro)

==============================================================================
2. Menus						*multilang-menus*

See |45.2| for the basics, esp. using 'langmenu'.

Note that if changes have been made to the menus after the translation was
done, some of the menus may be shown in English.  Please try contacting the
maintainer of the translation and ask him to update it.  You can find the
name and e-mail address of the translator in
"$VIMRUNTIME/lang/menu_<lang>.vim".

To set the font (or fontset) to use for the menus, use the |:highlight|
command.  Example: >

	:highlight Menu font=k12,r12


ALIAS LOCALE NAMES

Unfortunately, the locale names are different on various systems, even though
they are for the same language and encoding.  If you do not get the menu
translations you expected, check the output of this command: >

	echo v:lang

Now check the "$VIMRUNTIME/lang" directory for menu translation files that use
a similar language.  A difference in a "-" being a "_" already causes a file
not to be found!  Another common difference to watch out for is "iso8859-1"
versus "iso_8859-1".  Fortunately Vim makes all names lowercase, thus you
don't have to worry about case differences.  Spaces are changed to
underscores, to avoid having to escape them.

If you find a menu translation file for your language with a different name,
create a file in your own runtime directory to load that one.  The name of
that file could be: >

	~/.vim/lang/menu_<v:lang>.vim

Check the 'runtimepath' option for directories which are searched.  In that
file put a command to load the menu file with the other name: >

	runtime lang/menu_<other_lang>.vim


TRANSLATING MENUS

If you want to do your own translations, you can use the |:menutrans| command,
explained below.  It is recommended to put the translations for one language
in a Vim script.  For a language that has no translation yet, please consider
becoming the maintainer and make your translations available to all Vim users.
Send an e-mail to the Vim maintainer <maintainer@vim.org>.

					*:menut* *:menutrans* *:menutranslate*
:menut[ranslate] clear
			Clear all menu translations.

:menut[ranslate] {english} {mylang}
			Translate menu name {english} to {mylang}.  All
			special characters like "&" and "<Tab>" need to be
			included.  Spaces and dots need to be escaped with a
			backslash, just like in other |:menu| commands.
			Case in {english} is ignored.

See the $VIMRUNTIME/lang directory for examples.

To try out your translations you first have to remove all menus.  This is how
you can do it without restarting Vim: >
	:source $VIMRUNTIME/delmenu.vim
	:source <your-new-menu-file>
	:source $VIMRUNTIME/menu.vim

Each part of a menu path is translated separately.  The result is that when
"Help" is translated to "Hilfe" and "Overview" to "Überblick" then
"Help.Overview" will be translated to "Hilfe.Überblick".

==============================================================================
3. Scripts						*multilang-scripts*

In Vim scripts you can use the |v:lang| variable to get the current language
(locale).  The default value is "C" or comes from the $LANG environment
variable.

The following example shows how this variable is used in a simple way, to make
a message adapt to language preferences of the user, >

	:if v:lang =~ "de_DE"
	:  echo "Guten Morgen"
	:else
	:  echo "Good morning"
	:endif
<

 vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
