Vista Win32 MUI Application Development

Windows Language
Support
Multilingual Matters!
Non-English
Speakers
91.5%
Other English
Speakers
3.4%
Native English
Speakers
5.1%
2
Presentation Outline
Overview in Windows international settings
Overview of language support in Windows Vista
Deploying Windows Vista for multilingual scenarios
Developing Globalized Applications on Windows Vista
Developing Win32 MUI Applications
Q&A
3
Presentation Goals
Attendees should leave this session with:
Familiarity with Windows multilingual functionality and related
settings
Familiarity with multilingual deployment options for Windows
Vista
Familiarity with infrastructure and APIs provided in Windows
Vista for developing globalized applications
Pointers to additional information and resources
Out of scope: general Windows programming concepts
4
Assumptions
Familiarity with the basic concepts of writing globalized
applications.
Familiarity with Windows Win32 application development.
5
INTERNATIONAL SETTINGS IN
WINDOWS VISTA
6
International Settings in Windows Vista
Control panels:
Regional and Language Options
Date and Time
7
International Settings in Windows Vista
Date and Time:
8
International Settings in Windows Vista
Regional and Language Options:
Format: defaults for
Number formatting
Currency format
Date formats
Time formats
Sorting
Other user experiences
involving user cultural
preferences
9
International Settings in Windows Vista
Regional and Language Options:
Format: defaults for
Number formatting
Currency format
Date formats
Time formats
Sorting
Other user experiences
involving user cultural
preferences
10
International Settings in Windows Vista
Regional and Language Options:
Format: customizable defaults
11
International Settings in Windows Vista
Regional and Language Options:
Format: customizable defaults
12
International Settings in Windows Vista
Regional and Language Options:
Location
13
International Settings in Windows Vista
Regional and Language Options:
Keyboards and Languages
Enable/disable languages for
input & editing documents
Select keyboard layouts or
other input methods
14
International Settings in Windows Vista
Regional and Language Options:
Keyboards and Languages
Enable/disable languages for
input & editing documents
Select keyboard layouts or
other input methods
15
International Settings in Windows Vista
Regional and Language Options:
Keyboards and Languages
Enable/disable languages for
input & editing documents
Select keyboard layouts or
other input methods
16
International Settings in Windows Vista
Regional and Language Options:
Keyboards and Languages
Change language for Windows
user interface
Not all SKUs
17
International Settings in Windows Vista
Regional and Language Options:
Administrative
Machine-wide settings
“System locale”
Code page used by legacy apps
Also impacts some font
behaviours (font linking)
18
International Settings in Windows Vista
Regional and Language Options:
Administrative
Machine-wide settings
Copy to reserved accounts
Default settings for new users
19
International Settings in Windows Vista
Regional and Language Options:
Can apply settings from command line
control intl.cpl,, /f:"settingsfile.xml"
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current"/>
</gs:UserList>
<!--User Locale-->
<gs:UserLocale>
<gs:Locale Name="en-US" SetAsCurrent="true"/>
</gs:UserLocale>
</gs:GlobalizationServices>
http://www.microsoft.com/globaldev/vista/vista_tools/vista_co
mmand_line_international_configuration.mspx
20
MULTILINGUAL SUPPORT IN
WINDOWS VISTA
21
Multilingual Support in Windows Vista
Various possible levels of language support
Text display
Editing: text display and input method(s)
Keyboard layout or IME
Locale
Formats, collation, calendar
Localization
Partial — Complete
Extended language functionality
Voice: text-to-speech, speech recognition
Handwriting recognition
Language detection
Word breaker, stemmer; proofing tools
22
Text-display enablement
Includes:
Complex-script shaping support (if needed)
Fonts (at least one)
Font fallback
Implemented in Win32 APIs/controls
ExtTextOut, DrawText, User/common controls, RichEdit
May or may not get implemented:
Dictionary-based line breaking
Special vertical-layout behaviour
Other frameworks (e.g. GDI+, WPF)
23
Text-display enablement: scripts
Windows XP
Europe: Latin, Cyrillic, Greek
W. Asia: Arabic, Armenian, Georgian, Hebrew, Syriac
E. Asia: CJK (Simplified, Traditional, Kana, Hangul, CJK
Extension B)
S.E. Asia: Thai
S. Asia: Devanagari, Gujarati, Gurmukhi, Kannada, Telugu,
Tamil, Thaana
Surrogates
24
Text-display enablement: scripts
Windows XP SP2
Europe: Latin, Cyrillic, Greek
W. Asia: Arabic, Armenian, Georgian, Hebrew, Syriac
E. Asia: CJK (Simplified, Traditional, Kana, Hangul, CJK
Extension B)
S.E. Asia: Thai
S. Asia: Bengali, Devanagari, Gujarati, Gurmukhi, Kannada,
Malayalam, Telugu, Tamil, Thaana
Surrogates
25
Text-display enablement: scripts
Windows XP
CJK, “complex” scripts
not enabled in all SKUs
by default
26
Text-display enablement: scripts
Windows Vista
Europe: Latin, Cyrillic, Greek
W. Asia: Arabic, Armenian, Georgian, Hebrew, Syriac
E. Asia: CJK (Simplified, Traditional, Kana, Hangul, CJK
Extension B), Mongolian, Yi
S.E. Asia: Khmer, Lao, Thai
S. Asia: Bengali, Devanagari, Gujarati, Gurmukhi, Kannada,
Malayalam, Oriya, Sinhala, Telugu, Tamil, Thaana, Tibetan
Americas: Cdn Aboriginal Syllabics, Cherokee
Africa: Ethiopic
Surrogates
27
Text-display enablement: scripts
Oriya text with Kalinga Font
Khmer text with DaunPenh Font
Loa text with DokChampa Font
Sinhala text with Iskoola Pota Font
28
Text-display enablement: scripts
Windows Vista
Text display for all
scripts always enabled
(all editions / SKUs)
Note: some perf
considerations
29
Text-display enablement: scripts
Other enhancements:
Enhanced font fallback for Extension B
MingLiU vs. MingLiU_HKSCS vs. Simsun
Uniscribe
OpenType APIs
Apply discretionary OpenType feature tags
Apply OpenType language-system tags
Demo
Performance
30
Text-display enablement: fonts
Many new fonts
New fonts for newly-supported scripts
Kalinga ବୁ ଧବାର
Iskoola Pota බදාදා
ថ្ងៃពុធ
MoolBoran ថ្ងៃពុធ
DaunPenh
DokChampa ວັນພ
ຸ ດ
Mongolian Baiti ᠭᠠᠷᠠᠬ ᠦ᠋ᠨ ᠭᠤᠷᠪᠡᠨ
Microsoft Himalaya གཟའ་ལྷག་པ།
Microsoft Yi Baiti ꆏꊂꌕ
Nyala ረቡዕ
Euphemia ᐱᖓᑦᓯᖅ
Plantagenet Cherokee ᏦᎢᏁᎢᎦ
New “Aero”-theme UI fonts (ClearType hinting)
Segoe UI
Malgun Gothic 수요일
Meiryo すいようび
Microsoft JhengHei 星期三
Microsoft YaHei 星期三
31
Text-display enablement: fonts
Many new fonts
New ClearType-hinted document fonts
Calibri
Cambria / Cambria Math
Candara
Constantia
Corbel
Consolas
Other new fonts
Segoe Print
Segoe Script
Arabic Typesetting
‫ا ألربعاء‬
Microsoft Uighur ‫چارشەنبە‬
Leelawadee วันพุธ
SimSun-ExtB (Simp. Chinese)
Fangsong 星期三
KaiTi 星期三
MingLiU_HKSCS(-ExtB) 星期三
DFKai-SB 星期三
32
Text-display enablement: fonts
Additions to existing fonts: Unicode 5.0 updates
Arial
Courier New
Times New Roman
Microsoft Sans Serif
Tahoma
Font
XP File Size
Vista File
Size
XP Glyphs
Vista Glyphs
Arial
359 KB
749 KB
1680
3381
Arial Black
115 KB
117 KB
669
674
Arial Bold
344 KB
728 KB
1680
3381
Arial Bold Italic
222 KB
539 KB
966
2516
Arial Italic
203 KB
534 KB
966
2516
33
Text-display enablement: fonts
Overall
Windows XP SP2
Windows Vista
91.4 MB
290+ MB
712,000+ glyphs
almost 500,000 new glyphs
191 fonts installed by default
68 new fonts, 10 removed
218,725 glyphs
133 total fonts
34
Text-display enablement: fonts
Font smoothing: ClearType selected by default
Outline
Un-hinted
ClearType
Tuning:
http://www.microsoft.com/typography/ClearTypeInfo.mspx
35
Text-display enablement
Other graphics frameworks
GDI+
Small increase in script support:
New: Oriya; Arabic/Hebrew/Thai OpenType
Comparison with GDI:
Support for ClearType hinting
Support for TrueType-flavour OpenType fonts
Support for OpenType fonts with embedded bitmaps
No support for Type 1/CFF-OpenType, bitmap/vector .FON
Unsupported scripts: Mongolian, Sinhala, Tibetan
36
Text-display enablement
Other graphics frameworks (cont’d)
Windows Presentation Foundation (.Net 3.5)
New text stack (.Net 3.0): managed-code shaping
engines
ClearType, sub-pixel glyph positioning
Comparison with GDI
GDI does not support sub-pixel positioning
Support for OpenType fonts (TrueType or CFF outlines)
No support for embedded bitmaps
No support for Type 1, bitmap/vector .FON
Unsupported scripts: Khmer, Old Hangul, Sinhala
37
Text-display enablement
Other graphics frameworks (cont’d)
Windows Presentation Foundation (.Net 3.5)
ClearType, sub-pixel glyph positioning
38
Text-display enablement
Summary
Support for scripts used by all major languages with
broad market interest, and hundreds of lesser-known
languages
Most significant gap in current coverage: Myanmar
Enablement and fonts for a large portion of Unicode
5.0
Many characters not covered in Vista fonts will display
in documents using 3rd-party fonts
Support for advanced typography
WPF, Win32 (low-level APIs)
39
Text Input
Types of input
Keyboard / IME
Speech
Speech recognition
Text-to-speech
Hand-writing recognition
Infrastructure
Text Services Framework
40
Text Input
New keyboard layouts (non-IME)
Assamese – INSCRIPT
Khmer
Romanian (Programmer)
Bashkir
Lao
Romanian (Standard) –
[formally Romanian in XP]
Belgian (Period)
Lithuanian New
Sinhala
Bengali - INSCRIPT (Legacy)
Luxembourgish
Sinhala - Wij 9
Bulgarian (Latin)
Macedonian (FYROM) _ Standard
Sorbian Extended
Bulgarian (Phonetic)
Mongolian (Mongolian Script)
Sorbian Standard
Bulgarian (Typewriter)
Napali
Tajik
Georgian (Ergonomic)
Oriya
Tibetan (PRC)
Georgian (QWERTY)
Pashto (Afghanistan)
Turkmen
Greenlandic
Persian –
[formally Farsi in Windows XP
Uighur
Inuktitut –Latin
Portuguese (Brazilian ABNT2)
Ukrainian (Enhanced)
Inuktitut –Naqitaut
Romanian (Legacy)
Yakut
41
Text Input
IMEs
CJK IME enhancements
Addition character support
JIS 2004, Extension B
Improved UI, dictionaries, logic
New input modes
IME Pad available from all IMEs
Yi
Amharic
42
Text Input
Handwriting recognition
Chinese (Simplified)
French
Korean
Chinese (Traditional)
German
Portuguese
English
Italian
Spanish
Dutch
Japanese
43
Text Input
Voice
Speech recognition
US English
French
German
UK English
Japanese
Spanish
Chinese (Simplified)
Italian
Text-to-speech
US English
Chinese (Simplified)
Installed with UI language pack
44
Locale Data
Locale: default cultural conventions (formats, etc.)
Language / writing system / region
35 new Vista locales
Alsatian (France)
Bashkir (Russia)
Corsican (France)
English (Malaysia)
Hausa (Nigeria)
Khmer (Cambodia)
Lao (Lao P.D.R.)
Occitan (France)
Spanish (United States)
Tibetan (PRC)
Upper Sorbian (Germany)
Yi (PRC)
Amharic (Ethiopia)
Bengali (Bangladesh)
Dari (Afghanistan)
English (Singapore)
Igbo (Nigeria)
K'iche (Guatemala)
Lower Sorbian (Germany)
Oriya (India)
Tajik (Tajikistan)
Turkmen (Turkmenistan)
Wolof (Senegal)
Yoruba (Nigeria)
Assamese (India)
Breton (France)
English (India)
Greenlandic (Greenland)
Inuktitut (Syllabics, Canada)
Kinyarwanda (Rwanda)
Mongolian (Mongolian, PRC)
Sinhala (Sri Lanka)
Tamazight (Latin, Algeria)
Uighur (PRC)
Yakut (Russia)
206 total locales
45
Locale Data
Calendars
New: Saudi Hijri (Um Al Qura)
Supported calendars:
Gregorian
Hebrew (lunar)
Hijri
Japanese Imperial Era
Korean Tangun Era
Taiwan
Thai
Um Al Qura (Saudi Hijri)
46
UI Localization
Translate user-interface (menus, dialogs, etc) & helps
Different levels of localization
Language Packs for 36 SKU languages
Full
Partial + base language
Language Interface Packs (LIPs)
Most common UI only
47
UI Localization
SKU-level localization
Windows XP: 25
Arabic
Brazilian Portuguese
Chinese – Simplified
Chinese – Traditional
Chinese – Traditional (HK)
Czech
Danish
Dutch
English
Finnish
French
German
Greek
Hebrew
Hungarian
Italian
Japanese
Korean
Polish
Portuguese
Russian
Spanish
Swedish
Turkish
Norwegian -- Bokmål
48
UI Localization
SKU-level localization
Windows Vista: 36
Arabic
Brazilian Portuguese
Bulgarian
Chinese – Simplified
Chinese – Traditional
Chinese – Traditional (HK)
Croatian
Czech
Danish
Dutch
English
Estonian
Finnish
French
German
Greek
Hebrew
Hungarian
Italian
Japanese
Korean
Latvian
Lithuanian
Norwegian -- Bokmål
Polish
Portuguese
Romanian
Russian
Serbian – Latin
Slovak
Slovenian
Spanish
Swedish
Thai
Turkish
Ukrainian
49
UI Localization
SKU languages
Full, partial
Multilingual User Interface
(MUI)
Ultimate / Enterprise edns
User-selected UI language
Single-image deployment
for multiple languages
50
UI Localization
Language Interface Packs (LIPs)
Limited, common-UI (20-80 rule)
Tied to a parent language
60+ languages
Afrikaans
Albanian
Amharic
Armenian
Assamese
Azeri
Basque
Belarusian
Bengali
Bengali
Bosnian
Bosnian
Catalan
Filipino
Galician
Georgian
Gujarati
Hausa
Hindi
Icelandic
Igbo
Indonesian
Inuktitut
Irish
isiXhosa
isiZulu
Kannada
Kazakh
Khmer
Kinyarwanda
Kiswahili
Konkani
Kyrgyz
Lao
Luxembourgish
Macedonian
Malay
Malay
Malayalam
Maltese
Maori
Marathi
Nepali
Norwegian, Nynorsk
Oriya
Pashto
Persian
Punjabi
Quechua
Serbian
Sesotho sa Leboa
Setswana
Sinhala
Tamil
Tatar
Telugu
Urdu
Uzbek
Vietnamese
Welsh
Wolof
Yoruba
51
UI Localization
Obtaining language packs
SKU languages
~150MB (expand to ~1GB)
Ultimate: Vista Ultimate Extras (Windows Update)
Enterprise: Language Pack CD-ROM
Language of retail SKUs: availability depends on
region
LIP languages
Can only be installed on parent language
Free download
http://www.microsoft.com/unlimitedpotential/programs/llp.mspx
53
Other Global Features in Vista
World clocks
Indexing
Diacritic-sensitive
Indexing Options control Panel
55
Other Global Features
International Domain Names (IDNA)
Scam protection
Show only IDNs that match IE language settings
56
Extensible enablement
Text display
Can add new fonts, but not new complex-script shaping
engines
Input
Microsoft Keyboard Layout Creator (MSKLC)
Basic layouts (no IMEs)
http://www.microsoft.com/globaldev/tools/msklc.mspx
Infrastructure limitation: must associate with existing
LANGID
3rd-party:
IME: Yes
Voice/handwriting: No
57
Extensible enablement
Locales
Locale Builder (Beta 2)
Override existing locale / new custom locale
http://go.microsoft.com/fwlink/?LinkID=96654
Info: http://msdn.microsoft.com/enus/magazine/cc163506.aspx
Infrastructure limitation: all custom locales share single
LANGID
UI Language packs: not extensible
58
DEPLOYING WINDOWS VISTA FOR
MULTILINGUAL SCENARIOS
59
Windows Vista Deployment
Globalization scenarios
Create image with multiple language packs
WDS or other deployment tools
Create multilingual install point
Modify language settings in an image
Deploy a custom / replacement locale
60
Windows Vista Deployment
Setup with multilingual image
61
Windows Vista Deployment
Tools
Windows Automated Installation Kit (Windows AIK)
http://www.microsoft.com/downloads/details.aspx?FamilyID=993c
567d-f12c-4676-917f-05d9de73ada4&displaylang=en
Package Manager: add / remove lang packs
Intlcfg.exe: modify int’l settings
Image Manager: create unattended-settings file
62
Windows Vista Deployment
Create image with multiple language packs (WDS etc.)
Copy staged image (install.wim from sources folder) to local directory
Copy language packs (lp.cab from langpacks folder) to local directory
Mount image
imagex /mountrw c:\LP_Offline\Images\install.wim <imageId> c:\Mounted_Image
Remove language pack(s)
pkgmgr /a /up /m:c:\temp\en-US\lp.cab
/o:c:\Mounted_Image;c:\Mounted_Image\Windows /l:c:\log-files\uninstall-enUS.log
Add language pack(s)
pkgmgr /a /ip /m:c:\lps\de-DE\lp.cab
/o:c:\Mounted_Iimage;c:\Mounted_Image\Windows /l:c:\logs\install-de-DE.log
Regenerate lang.ini
intlcfg.exe –genlangini –image:c:\Mounted_Image –dist:c:\LP_Offline\Images
Unmount image and commit changes
imagex /unmount /commit c:\mounted_image
63
Windows Vista Deployment
Create multilingual install point
Create folder for distribution
mkdir c:\windows_distribution
Copy media contents
Make folders for LPs in distribution and copy LPs
mkdir C:\windows_distribution\Langpacks\de-DE
copy d:\Langpacks\de-DE\lp.cab c:\windows_distribution\Langpacks\de-DE
Copy Setup resources, license files for lang packs
xcopy D:\Sources\de-DE\* c:\windows_distribution\Langpacks\de-DE /cherkyi
Mount image
imagex /mountrw c:\windows_distribution\Sources\install.wim <imageId>
c:\Mounted_Image
Regenerate lang.ini
intlcfg.exe -genlangini -image:c:\Mounted_Image -dist:c:\windows_distribution
–all:de-DE
Unmount image and commit changes
imagex /unmount /commit c:\mounted_image
64
Windows Vista Deployment
Updating international settings
Offline image: use intlcfg.exe
Individual settings:
User locale
Also determines location
Input locale (language / layout)
System locale
UI language
UI language fallback
Time zone
-all:locale_name — sets to that locale (except time zone)
-skudefaults:language — sets as in MS SKU
65
Windows Vista Deployment
Updating international settings
During setup: use Unattend.xml
Individual settings
UI language
Language fallback
User locale
System locale
Input locale
Time zone
WinPE, specialize, OOBE phases
66
Windows Vista Deployment
<?xml version='1.0' encoding='utf-8'?>
<unattend xmlns="urn:schemas-microsoft-com:unattend"
xmlns:ms="urn:schemas-microsoft-com:asm.v3">
<settings pass="specialize">
<component name="Microsoft-Windows-International-Core"
publicKeyToken="31bf3856ad364e35" language="neutral"
versionScope="nonSxS" processorArchitecture="x86">
<UILanguage>ar-AR</UILanguage>
<UILanguageFallback>fr-FR</UILanguageFallback>
<SystemLocale>ar-AR</SystemLocale>
<UserLocale>ar-AR</UserLocale>
<InputLocale>0401:00000401</InputLocale>
</component>
<component name="Microsoft-Windows-Shell-Setup"
publicKeyToken="31bf3856ad364e35" language="neutral"
versionScope="nonSxS" processorArchitecture="x86">
<TimeZone>ar-AR</TimeZone>
</component>
</settings>
</unattend>
67
Windows Vista Deployment
Updating international settings
Customizing OOBE defaults: OOBE.xml
Just sets defaults; user still selects values
68
Windows Vista Deployment
TechNet Resources
Deployment overview:
http://technet.microsoft.com/en-us/library/cc748937.aspx
Step-by-step guide:
http://technet.microsoft.com/en-us/library/cc766320.aspx
Step-by-step — language packs & int’l settings:
http://technet.microsoft.com/en-us/library/cc722391.aspx
69
Windows Vista Deployment
Custom/replacement locales, custom keyboard layouts
Tools: Locale Builder / MS Keyboard Layout Creator
Can create .msi
No other features for network deployment
70
Windows Vista Deployment
Language packs and servicing
GDRs/QFEs
Same GDR/QFE for all languages
If patch has resources, then is multilingual
most (~80%) have no resources
Smart: only downloads/installs languages needed
Adding new language packs
GDRs will be re-offered
Recommend to add LP before servicing
71
Windows Vista Deployment
Language packs and servicing
Service Packs
Multilingual
SP1: 5-language versus all-language
English, French, German, Japanese, Spanish
Get the right package!
http://support.microsoft.com/kb/935791/
All LPs updated after SP
Can deploy updated LP before or after SP
72
DEVELOPING GLOBALIZED
APPLICATIONS ON WINDOWS
VISTA
73
Globalization
The ability of any feature to allow the customer to use, input, process,
store, and output in any language, independent of the language and
market of Windows.
Enable your
product to be
used worldwide
Use APIs to
avoid hardcoding marketspecific support
Vista has API
support for over
200 locales
Why Globalize?
Providing local experiences
Individual users feel like the application was created just for
them
Scale your application to new markets without hard-coding
Avoid usability problems
Sometimes a nuisance factor
E.g. month, day in wrong order
Other times a blocking issue
E.g. actually cannot read date (different language)
Consistency across the desktop user experience
User has a seamless experience across applications
75
Use Unicode
Benefits
Don’t need to manage code pages to provide broad,
multilingual functionality
Legacy code pages don’t cover the range of world
languages
Many Unicode-only locales
Surrogate characters not supported in code pages
Use Unicode everywhere!
Not just interfaces; all the way through
76
Use Unicode
Using Unicode
Native code:
Don’t use “ANSI” API calls
“W” API calls: UTF-16
WCHAR, LPWSTR: explicit 16-bit
LPWSTR str = L"This is a Unicode string"
CRT: wcscmp, wcscpy_s
.Net: strings are Unicode by default
77
Use Unicode
Using Unicode
Conversion for code pages when necessary
Win32:
MultibyteToWideChar
WideCharToMultibyte
.Net: System.Text namespace
Conversion for Internationalized Domain Names
IdnToAscii
IdnToNameprepUnicode
IdnToUnicode
78
Use Unicode
Using Unicode
Diagnosing the problems
???
/
gibberish
/
79
Displaying multilingual text
Many operations involved
Characters to glyphs
Surrogates
Bidi
Shaping, cluster analysis
OpenType Layout (glyph transforms, positioning)
Rasterization
Low-res smoothing
80
Displaying multilingual text
Many operations involved
Measuring
Must consider complex-script behaviour
Hit-testing (mouse-click to string position)
Boundaries: line / word / cluster
Caret, selection
Font fallback
Justification, paragraph layout
81
Displaying multilingual text
Caveats
Don’t draw one character at a time
Filters, text effects: get outline of entire rendered
string
Don’t assume non-negative “A”, “C” widths
Don’t assume width of string = sum(width of char i)
82
Displaying multilingual text
Caveats
Don’t assume words separated by space
Don’t assume order of characters = order of glyphs
Don’t assume characters:glyphs = 1
Don’t assume characters:cluster = 1
Don’t assume carat can go between any 2 characters
Don’t assume any character can be selected
Height of string may be greater than tmAscent –
tmDescent
Can’t assume text never bleeds outside
clipping rectangle
83
Displaying multilingual text
Native APIs
ExtTextOut
DrawText
User controls (Edit, List, etc.)
hwndEdit = CreateWindow("EDIT", NULL, WS_CHILD|… );
Edit_SetText() / SetWindowText()
RichEdit control
Use MSFTEDIT_CLASS (msftedit.dll)
Common controls (comctl32.dll)
hwndEdit = CreateWindow("WC_EDIT", NULL, WS_CHILD|… );
84
Displaying multilingual text
Native APIs
Uniscribe
ScriptStringAnalyse: high-level API used by standard
Win32 APIs, controls
Also several low-level APIs
GDI+
Font, Graphics.DrawString
Distinct text stack from GDI, not as extensive script
support
85
Displaying multilingual text
Native APIs
Broad script support: all supported scripts
Much done for free — if used correctly
Bidi, shaping & glyph transforms
Default OpenType features (e.g. ligatures) automatically
applied, but not for some scripts in ETO, RichEdit
Rasterization, smoothing
Font fallback
Not in Uniscribe low-level APIs
RichEdit has different logic than other controls, APIs
86
Displaying multilingual text
Native APIs
Much done for free (con’t)
Hit testing, measuring
Boundaries
Clusters
Basic word-stop, line-breaking
Thai dictionary, not for Khmer, Lao, …
87
Displaying multilingual text
Native APIs
Points to note
Algorithms that measure to find line-break
opportunities: beware of performance!
Excessive calls to shape text can result in severe perf hit
GDI LOGFONT: lfCharset
Legacy, related to code page
ANSI_CHARSET = cp1252
Use DEFAULT_CHARSET
88
Languages and locales
Multiple concepts
UI language
Per-user default, fallback preferences
Thread default, fallback preferences
Input locale
Language + keyboard-layout / input-method ID
Set of enabled input locales per user
Active input locale, per thread
User locale — user’s default locale for formats,
sorting, etc.
89
Languages and locales
Multiple concepts
Thread locale — current thread locale for formats…
Defaults to user’s setting
Alternate can be set programmatically
System locale
System-wide setting
Main purpose: code page for legacy applications
Location — user’s location (GeoID)
APIs to obtain values for each concept
Make sure to use the appropriate one!
90
Languages and locales
LCIDs / LANGIDs versus locale name IDs
Original Win32: LCIDs, LANGIDs
LCID: 32-bit, numeric locale ID
E.g. 0x0409 = English (U.S.)
LANGID: 16-bit, numeric ID
Locale minus sort variations
.Net: CultureInfo
CultureInfo.Name: string IDs
E.g. “en-US”
Region-neutral cultures — e.g. “en”
Win-32 in Vista: introducing SName (string IDs)
91
Languages and locales
Locale identifiers
LCIDs
• Numeric values that represent
sets of locale data (e.g. 0409 is
English – United States)
Strings
• String-based values that allow for
more transparent and predictable
labeling of locale data (e.g. en-US
is English – United States)
92
Languages and locales
Use locale name, not LCID / LANGID
IETF compliant
Interoperability
Pick up user-defined custom locales
Pick up new Windows functionality over time
All LCID-based APIs have equivalent name-based
support in Vista
Existing gaps
Input locales still expressed only in terms of LCIDs
93
Keyboard input
Caveats
Don’t assume only one language
User may have several languages enabled for input and
switch between them
Don’t assume one keyboard layout
VK_A is not always “A”
Not every keyboard supports VK_n
Not every keyboard supports every character
Don’t assume one character on every keystroke
Use KeyPress event, not KeyUp / KeyDown
94
Keyboard input
Caveats
Not all keyboard hardware have the same keys
Application shortcuts
Microsoft Keyboard Layout Creator
User can create completely custom layout
No limits on what characters will be input
May step on top of your application shortcuts
95
Keyboard input
Win32
Input locale — HKL
32-bit integer combining LANGID and numeric inputmethod ID
Infrastructure limitation: only part of infrastructure in
Vista not using string IDs
APIs
GetKeyboardLayoutList() — enabled ILs for user
GetKeyboardLayout() — active IL for thread
WM_INPUTLANGCHANGEREQUEST, WM_INPUTLANGCHANGE
— active IL for window changing
ActivateKeyboardLayout() — set active IL for thread
96
Keyboard input
Win32
Get input characters
WM_CHAR, WM_UNICHAR — key-press event
But… IMEs, non-keyboard input-methods more
complex
Text Services Framework
Recommendation: use provided controls
Handle all lower-level input interactions, including IME
97
Locales
Combine multiple dimensions
Locale data
Language
Writing
System
Region
98
Locales
Locale data contain many kinds of information
Properties of
language
Properties of
language + region
• Names of
languages and
regions
• Text formatting
information
• Sorting
information
• Calendar system
• Date and time
formats
• Number formats
• Keyboard
standards
• Font
preferences
Properties of
region
• Time zone
• Currency
formatting and
preferences
99
Locales
Locale data: useful for
Date formats
Time formats
Number formats
Currency formats
Sorting
All kinds of user experiences where a customer’s
cultural preferences matter
Location: useful for
Region-specific content that you’d like to make
available
Aspects of user experience that are culture-specific
but not linguistic in nature
100
Locales
Rely on locale data to help create globalized experience
Dev: My calendar app needs to support Windows users worldwide.
Which calendars and date formats are important in different markets?
Dev: Where are Windows users? I’ll ask Windows to tell me which locales are
supported by enumerating the locales on the machine.
Windows: Here is a list of all the locales on the machine. I will give you this
information by listing the identifiers for all the locales that I support.
Dev: For each locale, what calendar, date formats, and month/day names are locally
preferred so that I know what to display? I will ask for this one locale at a time by
passing the identifiers on your list into your API.
Windows: Here is a list of all the information you asked for, for each locale.
101
Locales
Win32 APIs (sampling):
Enumerate available choices
EnumSystemLocalesEx() — get list of installed /
supported locales on current system
EnumSystemGeoID() — get list of supported GeoIDs
on current system
Get settings
GetUserDefaultLocaleName() — user’s default
locale
GetThreadLocale() — active locale set on thread
102
Locales
Win32 APIs (sampling):
Set settings
SetThreadLocale() — set active locale on thread
Get particular data
GetLocaleInfoEx() — get particular details for a
given locale
GetCalendarInfoEx() — get particular details for a
given calendar
Formatting
GetDateFormatEx() — format numeric date as a date
string using conventions for a certain culture
103
Locales — Collation
Users expect lists of strings to come in some
predictable order
Preferences vary by language and culture
“ll” in English vs. Spanish
“I” vs. “i” vs. “İ” vs. “ı” (cf. Turkish)
Users only know something is wrong when they can’t
find something they expect to be there
Machines expect lists of strings to come in some
particular order
Whatever order was assumed when list was first made
will be expected later too
104
Locales — Collation
Binary vs. linguistically-appropriate: when to use which?
“Y” (U+0059) vs. “y” (U+0079) vs. “ʏ” (U+028F)
Ordering vs. Ordinal (identity)
Which comes first? vs. Is that the same one?
Use linguistically-appropriate sorting for strings
ordered to present to users
Use binary sorting when building indexes and want
stability in behaviour over time
105
Locales — Collation
Binary vs. linguistically-appropriate: one comparison
106
Locales
Caveats
Don’t hard-code particular conventions
E.g. don’t assume particular currency
Use globalized behaviour for presentation… but not for
machine-readable values
Localized presentation
Locale-neutral concept, locale-neutral representation in storage,
inter-process communication, etc.
107
Locales
Caveats
Things change!
Countries merge, split apart, join EU…
Governments declare new official languages
Government change official names of countries, languages
Languages are written in new writing system
New calendar systems are legislated
New currencies or currency symbols are adopted
Don’t hard-code identifiers
Don’t assume particular culture-specific data values
Things in the world really do change!
108
Locales
Caveats
User-level, things can change!
Regional and Language Options control panel: user can customize formats
If user overrides a value in a locale but then changes locale, customization is
lost
Microsoft Locale Builder
Modify existing locales
Create new custom locales — e.g. English (Japan), Ojibwa (Canada)
Certain things can’t be changed
Default code page for existing locale
Default sort for existing locale
Month / day strings in non-Gregorian calendars
109
Locales
Final thoughts: Don’t roll your own!
We have platform APIs so that developers never need
to think about geopolitically sensitive data.
We service our data so you don’t have to.
Don’t create your own solutions – it’s expensive and
not scalable.
If there’s something you need and we don’t provide
it, let us know.
110
Globalizaton: DOs and DON’Ts
DO use Unicode
DON’T store data in any legacy code page
DO expect any kind of character
DON’T expect a specific character to be there
DO use platform controls
DON’T assume one character = 1 cluster = 1 glyph
DO draw / measure entire strings
DON’T use LCIDs
DO use culture names
DON’T ignore user preferences
DO use appropriate string comparisons
111
DEVELOPING WIN32 MUI
APPLICATIONS
112
MUI: What and Why
Past practice
English-then-re-engineered-localization development
Forked sources
Costly development
Multiple binary images to develop, deploy, service
Inflexible, single-language product
Goals
Reduce cost of developing, deploying, servicing
Reduced costs, greater flexibility for customers
113
MUI: What and Why
Multilingual User Interface
Single world-wide binary / satellite-resource model
Single sources, build process, binary image to manage /
maintain
Multilingual UI options, configuration-driven
Simpler, more flexible for customers
MUI in Windows
Evolving since Windows 2000
Vista: fully attained SWWB / satellite resources
114
MUI: How it works
Windows UI-language settings
System-default UI language
System-preferred UI language
User-preferred UI language
System / user settings must be installed, system
languages
Thread UI languages
Up to 4 application languages
Application UI language need not be installed as system
languages
116
MUI: How it works
UI Language Fallback list
Fall-back order
Per-thread UI language
User-preferred UI language
System-preferred UI language
System-default UI language
Resource loader automatically manages resource
satellites
Search satellites for resource in order
Partial localization supported
LIP + base language
117
MUI Applications
A properly-globalized application that
Separates localized resources into separate, interchangeable packages
Can have multiple language packages installed and in
use
Follows system- / user-configuration settings and
fallback behaviour whenever possible
118
Developing Win32 MUI Apps
Some considerations
Best user experience: consistent language
throughout — within app, across apps/OS
Best practice:
Plan translation of resources carefully
Package code, localizable resources separately
Load resources according to OS UI language settings
Deploy cleanly on multilingual systems
119
Developing Win32 MUI Apps
Resource technologies
Windows MUI assumes use of Win32 resources
Proprietary resources: follow system’s fallback list by calling
GetThreadPreferredUILanguage()
Common resource technologies in Windows include:
Win32
Registry strings
Shell strings
Help files
Windows Event Log
Group Policy
WMI
MFC resource DLLs
120
Developing Win32 MUI Apps
Resource models
Single-language
Multi-language
Satellite
Code
Code
Code
Language neutral file
Resources (ja-JP)
Resources (en-US)
Resources (ja-JP)
Resources (en-US)
Resources (ja-JP)
121
Developing Win32 MUI Apps
Store localizable resources in satellite .mui files
Use .rc files as before
Use XML Resource Configuration (RC Config) file to
specify which resources are to be stored in .mui file
Use updated RC compiler or MUIRCT to generate .mui
files
Install .mui files using MUI naming conventions
<install dir>\foo.exe
<install dir>\en-US\foo.exe.mui
<install dir>\ja-JP\foo.exe.mui
122
Developing Win32 MUI Apps
RC Config example
<?xml version="1.0" encoding="utf-8"?>
<localization>
<resources>
<win32Resources fileType="Application">
<neutralResources>
<resourceType typeNameId="#16" />
</neutralResources>
<localizedResources>
<resourceType typeNameId="#2" itemId="5 6 7 8 9 10 11 12“
itemName="HTML PRI" />
<resourceType typeNameId="#4" />
<resourceType typeNameId="#16" />
</localizedResources>
</win32Resources >
</resources>
</localization>
123
Developing Win32 MUI Apps
Workflow: localize source (.rc) versus localize PE (.exe)
Source localization:
Localize .rc files
Generate MUI file:
Build .mui with RC compiler, or
Build PE and use MUIRCT to split off .mui from langneutral PE
PE file localization:
Build en PE and use MUIRCT to split off .mui from langneutral PE
Localize .mui file
124
Developing Win32 MUI Apps
Workflow: source localization, RC compiler
Source
code
Compiler
Compiled
.OBJ file
Linker
Localization
LN PE file
(foo.exe)
Compiled LN
resources
.RC files
.RC
files
Localized
.RC files
RC.exe
RC Config
file
Compiled
Localized
resources
Linker
MUI files
(foo.exe.mui)
125
Developing Win32 MUI Apps
Workflow: source localization, MUIRCT
Source
code
Compiler
& Linker
MUIRCT.
exe
.RC file
Localization
LN PE File
(foo.exe)
Executable
(foo.exe)
RC Config
file
MUI file
(foo.exe.mui)
126
Developing Win32 MUI Apps
Workflow: PE localization, MUIRCT
Source
code
Compiler
& Linker
LN PE File
(foo.exe)
Executable
(foo.exe)
MUIRCT.
exe
.RC file
RC Config
file
MUI file
(foo.exe.mui)
Localization
127
Developing Win32 MUI Apps
Loading Win32 resources
MUI support is handled transparently
To set application-specific language, use
SetThreadPreferredUILanguages()
Use existing resource-loading API calls without
specifying language
Use the language-neutral executable as the module
name (not the .mui file)
128
Developing Win32 MUI Apps
Registry strings:
Don’t store localizable strings in registry — move to a
resource file
Replace with language-neutral redirection strings of
form “@<res binary>,-<res ID>”
E.g. “@tzres.dll,-161”
Call RegLoadMUIString()
Redirection string parsed, resource loaded
transparently
Don’t call RegGetValue()!
129
Developing Win32 MUI Apps
Pre-Vista Windows: Win2000/XP/Server2003
Down-level resource loader does not support Vista
.mui files
LANGID vs. language names
Muiload.lib (Windows SDK)
Use LoadMUILibrary() / FreeMUILibrary()
Returns handle to appropriate language-specific
resources
131
Q&A
132
Thank you
133
Heading
Level 0
Level 1
Level 2
Level 3
134