I just checked the character set of Calibri and Cambria and confirm that they cover all the major languages of Europe (hence also of America). I can check for the other ClearType fonts if that makes you feel more comfortable, but I doubt the coverage is any different.
As has already been stressed, though, your choice of fonts depends a lot on the exact set of languages you're targetting: usually, you can be confident that any commercial font covers at least all the languages of Western Europe (English, French, German, Italian, Spanish, Portuguese, etc.). If you want to add Polish, Czech, Slovak, etc. to that, you need fonts with “Central European” coverage (usually tagged as CE in the Adobe font library). For Greek, you of course need a font with Greek characters, and for Russian a font with Cyrillic characters (which usually covers Ukrainian, Bulgarian, Serbian, etc. as well). The ClearType fonts support all of the above, btw.
In the end, nothing beats checking it for yourself: if you know what language you want to support, you can examine the font you intend on using, and check for the characters you're looking for. Michael's Everson Alphabets of Europe is a great resource here. It might seem tedious to have to go through all the individual languages, but it's something you really have to do it order to make an informed decision.
If you need to support Arabic or Hebrew, Indic scripts or scripts from South-East Asia, or ideographic scripts, then the picture is wholly different, as has already been said, and I doubt any single font would fit here, except for the very rare fonts that attempt to be comprehensive (which, by the way, is an illusion).
In the meantime I did find a solution for my problem on myself:
I created a new class "LocalizeHelper":
Header LocalizeHelper.h
//LocalizeHelper.h
#import <Foundation/Foundation.h>
// some macros (optional, but makes life easy)
// Use "LocalizedString(key)" the same way you would use "NSLocalizedString(key,comment)"
#define LocalizedString(key) [[LocalizeHelper sharedLocalSystem] localizedStringForKey:(key)]
// "language" can be (for american english): "en", "en-US", "english". Analogous for other languages.
#define LocalizationSetLanguage(language) [[LocalizeHelper sharedLocalSystem] setLanguage:(language)]
@interface LocalizeHelper : NSObject
// a singleton:
+ (LocalizeHelper*) sharedLocalSystem;
// this gets the string localized:
- (NSString*) localizedStringForKey:(NSString*) key;
//set a new language:
- (void) setLanguage:(NSString*) lang;
@end
iMplementation LocalizeHelper.m
// LocalizeHelper.m
#import "LocalizeHelper.h"
// Singleton
static LocalizeHelper* SingleLocalSystem = nil;
// my Bundle (not the main bundle!)
static NSBundle* myBundle = nil;
@implementation LocalizeHelper
//-------------------------------------------------------------
// allways return the same singleton
//-------------------------------------------------------------
+ (LocalizeHelper*) sharedLocalSystem {
// lazy instantiation
if (SingleLocalSystem == nil) {
SingleLocalSystem = [[LocalizeHelper alloc] init];
}
return SingleLocalSystem;
}
//-------------------------------------------------------------
// initiating
//-------------------------------------------------------------
- (id) init {
self = [super init];
if (self) {
// use systems main bundle as default bundle
myBundle = [NSBundle mainBundle];
}
return self;
}
//-------------------------------------------------------------
// translate a string
//-------------------------------------------------------------
// you can use this macro:
// LocalizedString(@"Text");
- (NSString*) localizedStringForKey:(NSString*) key {
// this is almost exactly what is done when calling the macro NSLocalizedString(@"Text",@"comment")
// the difference is: here we do not use the systems main bundle, but a bundle
// we selected manually before (see "setLanguage")
return [myBundle localizedStringForKey:key value:@"" table:nil];
}
//-------------------------------------------------------------
// set a new language
//-------------------------------------------------------------
// you can use this macro:
// LocalizationSetLanguage(@"German") or LocalizationSetLanguage(@"de");
- (void) setLanguage:(NSString*) lang {
// path to this languages bundle
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
if (path == nil) {
// there is no bundle for that language
// use main bundle instead
myBundle = [NSBundle mainBundle];
} else {
// use this bundle as my bundle from now on:
myBundle = [NSBundle bundleWithPath:path];
// to be absolutely shure (this is probably unnecessary):
if (myBundle == nil) {
myBundle = [NSBundle mainBundle];
}
}
}
@end
For each language you want to support you need a file named Localizable.strings
. This works exactly as described in Apples documentation for localization. The only difference: Now you even can use languages like hindi or esperanto, that are not supported by Apple.
To give you an example, here are the first lines of my english and german versions of Localizable.strings:
English
/* English - English */
/* for debugging */
"languageOfBundle" = "English - English";
/* Header-Title of the Table displaying all lists and projects */
"summary" = "Summary";
/* Section-Titles in table "summary" */
"help" = "Help";
"lists" = "Lists";
"projects" = "Projects";
"listTemplates" = "List Templates";
"projectTemplates" = "Project Templates";
German
/* German - Deutsch */
/* for debugging */
"languageOfBundle" = "German - Deutsch";
/* Header-Title of the Table displaying all lists and projects */
"summary" = "Überblick";
/* Section-Titles in table "summary" */
"help" = "Hilfe";
"lists" = "Listen";
"projects" = "Projekte";
"listTemplates" = "Vorlagen für Listen";
"projectTemplates" = "Vorlagen für Projekte";
To use localizing, you must have some settings-routines in your app, and in the language-selection you call the macro:
LocalizationSetLanguage(selectedLanguage);
After that you must enshure, that everything that was displayed in the old language, gets redrawn in the new language right now (hidden texts must be redrawn as soon as they get visible again).
To have localized texts available for every situation, you NEVER must write fix texts to the objects titles. ALWAYS use the macro LocalizedString(keyword)
.
don't:
cell.textLabel.text = @"nice title";
do:
cell.textLabel.text = LocalizedString(@"nice title");
and have a "nice title" entry in every version of Localizable.strings!
Best Answer
Arial Unicode MS is not redistributable and is installed with Microsoft Office: Lucida Sans Unicode ships with Windows though, and has characters for most of the languages on your list (not Chinese, though, I believe).
http://alanwood.net/unicode/fonts.html is a good resource for seeing which fonts contain which characters.