The process of adapting a
product or service to the needs of different regions and cultures
is known as internationalization. The term is sometimes abbreviated
as "i18n", where the number 18 refers to the number of letters
The Currency System family of software and services was designed
to offer complete support for the internationalization of currency-related
applications, both when deployed or implemented as a stand-alone
solution, and when integrated as part of a broader internationalization
The internationalization of a currency-enabled application,
such as a database or an e-commerce system, is most likely to
require support for more than just the conversion of currency
amounts from one unit to another. Regardless of whether you
need to build a simple list of daily reference rates, or if
instead you have to convert thousands of prices in a database,
you will probably want to take into account rules such as those
which apply to the formatting of currency amounts, which vary
from locale to locale.
A locale is a set of cultural preferences which are assigned
to a given region. Within a specific locale the same settings
apply, i.e. a locale defines the largest possible region sharing
the same country name, currency name, language and other localization
A locale does not necessarily exactly match with a language
or with a country. For example, the English language is used
in multiple countries and regions (e.g. United States, Canada,
United Kingdom, Australia, etc.) which are covered by multiple
locales. Even when the language is the same, details such as
currency symbols and the formatting of currency amounts may
change between one locale and another. Similarly, countries
may have multiple locales, e.g. Canada has different locales
for its English and French language regions, where not only
currency names change, but also other settings, e.g. the placement
of the currency symbol relative to the amount. Associating the
user selection of languages and/or locales to flag graphics,
as is sometimes seen on websites, shows neither equal respect
for different countries where the same language is spoken, nor
consideration for the fact that a country may have more than
one official language.
Currency Server not only
fully supports the Windows locale functionality, which it uses
to set the default initial software configuration, but it also
adds software-specific properties to each locale (e.g. currency
names, capitalization style, etc.)
Non-Localized Properties and Rules
Locales are independent from exchange rate data. Exchange
rates and numerical results are not affected by locale settings.
If you only use the software to obtain numerical results, you
do not need to use locales at all. If you only use Currency
Server to output formatted currency amounts on an English language
website you can in general use the default locale and settings
without further changes.
When Currency Server COM and Web service (.NET and
SOAP) clients need to reference a specific locale (e.g. as an
argument to a method returning a localized currency name), the
recommended identifier for the desired locale is the Windows
locale identifier, or LCID, which is a 32-bit numerical value,
as used in the Windows National Language Support API (NLSAPI).
The LCID of US English is 1033 (decimal).
In addition to numerical LCID codes, Currency Server also
supports the referencing of locales by means of three-character
Windows locale codes (e.g. "DEU", i.e. two-character ISO 639-1
Alpha-2 language codes plus an additional character, as specified
for use with the Windows "LOCALE_SABBREVLANGNAME" type, which
is not necessarily the same as the three-character ISO 639-2
Alpha-3 standard). Two-letter ISO 639-2 Alpha-2 language codes
(e.g. "de") are also supported, however they should only be
used as a last resort, because there can be multiple locales
for a given language, in which case Currency Server would resort
to the first matching locale.
Currency Names, Symbols and Custom Data
Currency Server supports the following localized properties
for each currency:
- Currency Name (e.g. "Swiss franc", "Schweizer Franken",
"Franco svizzero", etc.);
- Currency Symbol (e.g. "$" or "US$");
- Custom String (e.g. "usd.gif" to indicate the location
of a flag image file).
For example, the US English locale contains all US English
names for all currencies of the world. It also contains the
currency symbols of all currencies of the world, as used in
the United States (the same currency may be referenced using
a different symbol in different regions).
Each currency may also have a localized custom string, which
is undefined by default, and which may be set as required by
Other Currency Properties
Currency Server also associates a unique currency code (e.g.
"USD") with each currency. Unlike currency symbols (which are
localized, i.e. different locales may use different symbols
for the same currency, e.g. "öS" vs. "S" for the Austrian schilling),
currency codes are standard, and are not localized (they are
the same all over the world). Be sure not to confuse localized
currency symbols, which are meant for presentation purposes
only, with standard currency codes, which can be used both to
uniquely identify currencies and for presentation purposes.
Currency Server supports several other currency-specific
properties, such as the exchange rate, the regime, the smallest
unit, etc., however these properties, like the currency code,
are not locale-specific, but rather they are independent of
the locale. They only have to be set once for each currency
(and not once for each currency for all locales which are used).
Currency names are usually written in lower case as a rule.
In some languages (e.g. German) all nouns, including currency
names, are always capitalized (both in body text and in titles).
In some languages (e.g. English) titles are capitalized, which
style may also be appropriate in drop-down lists, etc. For example,
the Currency Server user interface uses title style in most
Internally, Currency Server stores currency names using the
singular form and body text style, i.e. without title capitalization
(headline style). For example, the default internal US English
name of the USD currency is "US dollar", not "US dollars" or
"US Dollar". When a COM or Web service client requests
the name of the USD currency indicating the US English locale
(LCID 1033) and the desired title style (True or False), Currency
Server returns either "US Dollar" or "US dollar", as requested
by the client. In title style the word "dollar" is capitalized
as specified by the Capitalize titles setting in the Edit Locale
dialog, which is enabled by default for US English.
Currency Server supports both ISO 8859-1 (Latin 1) 8-bit
encoding of the currency name, symbol and custom string, and
Unicode (16-bit) encoding.
The COM and Web service methods which output formatted
currency strings, i.e. ConvertToStr() and RateStr(), support
the output of HTML character entity references instead of characters
having decimal codes greater than 127 (e.g. "£ 12.34" instead
of "£ 12.34").
The default currency names preset for the US English locale
do not use Unicode characters. Unicode characters with no equivalent
character in ISO 8859-1 encoding may be present in the currency
names when certain Asian and certain other locales are used.
The default currency symbols preset for the US English locale
use Unicode characters for some Asian and certain other currencies.
If your application does not support Unicode, you may want to
edit these currency strings in the properties of the locale(s)
you plan to use.
Formatting of Currency Amounts
The formatting of currency amounts for presentation purposes
depends on several locale-specific (not currency-specific) currency
formatting settings. For example, the same dollar amount written
as "$12,345.67" in the US would be "$ 12.345,67" in Italy. These
regional options include the decimal symbol (also known as fractional
separator), the digit grouping symbol (also known as group separator),
the placement of the currency code or symbol (before or after
the amount, with or without a separator) and the type of digit
grouping (e.g. "123456789" vs. "123 456 789" vs. "12 34 56 789").
These preferences can be modified in the
Edit Locale dialog.
The ConvertToStr() and RateStr() COM and Web service
methods include powerful formatting functionality which takes
into account both the requested locale and additional formatting
options (e.g. output using standard currency code vs. localized
currency symbol, etc.)
Locales, Countries, Domains and Currencies
The COM and Web service interfaces include internationalization
functions such as LocaleToCurrency(), CountryToCurrency() and
DomainToCurrency() which may make it easier for example to automatically
set an initial default currency, e.g. on an e-commerce site
based on the internet domain of the customer.
While useful, these functions have some limitations:
- Since there is no exact relationship between locales
and currencies (e.g. a two-letter language locale code may
match different countries with different currencies, and
a three-letter code may match a country which is in a transition
between two currencies), the result may be approximate (especially
if two-letter language codes are used, whereas LCID codes
or three-letter Windows locale codes lead to more focused
results). If the input string is empty or could not be resolved,
the function returns a currency for the default locale set
in Currency Server. If this default currency does not satisfy
the ActiveOnly requirement, the first active currency (in
alphabetical order sorted by ISO 4217 Alpha-3 code) is returned.
- Since there is no exact relationship between countries
and currencies (in some countries more than one currency
may be in practical use, e.g. during the transition from
an old currency to a new currency, or because a "stronger"
currency is preferred), the result may be slightly approximate
(but correct in most cases).
- Since there is no exact relationship between internet
Top Level Domains (TLDs) and countries and/or currencies
(e.g. a currency or internet top level domain may be used
in multiple countries), the result may be approximate.
In the worst case, i.e. if multiple or no matches occur,
Currency Server either returns the first currency matching the
argument, or the first currency for the default locale, or,
as a last resort, the first active currency (in alphabetical
order sorted by ISO 4217 Alpha-3 code).
For more in-depth information, we recommend that you have
a look at the Internationalization section in the Working
with Currencies chapter of the Currency Server