the world and why you should care! internationalization ... · pdf fileinternationalization -...

33
1 Internationalization - How it can change the world and why you should care! Intro to Production Internationalization: Who, What, and Why Join with Women in Localization for a webinar describing the basics behind product internationalization (i18n). This talk is for those working on globalization and language from the client/buyer-side who do not have day-to-day experience with internationalization, but wish to learn more. The information shared will provide attendees with a high-level understanding of the practice and the ability to explain its importance to others. The presentation will describe the value internationalization adds to a global organization, who is typically in charge of the process, what areas of the company are benefited, and what it takes to internationalize a product or ensure a good hand-shake with a system that must integrate with globalization.

Upload: dokhue

Post on 06-Mar-2018

216 views

Category:

Documents


2 download

TRANSCRIPT

1

Internationalization - How it can change the world and why you should care!

Intro to Production Internationalization: Who, What, and WhyJoin with Women in Localization for a webinar describing the basics behind product internationalization (i18n). This talk is for those working on globalization and language from the client/buyer-side who do not have day-to-day experience with internationalization, but wish to learn more. The information shared will provide attendees with a high-level understanding of the practice and the ability to explain its importance to others. The presentation will describe the value internationalization adds to a global organization, who is typically in charge of the process, what areas of the company are benefited, and what it takes to internationalize a product or ensure a good hand-shake with a system that must integrate with globalization.

2

3

4

6

• What is internationalization?• Internationalization maturity levels• Different aspects of i18n

– Data integrity (handling input/output in different languages)– Locales including time zones, languages, currency, etc.– String externalization– Platform i18n including input methods, fonts, etc.

•The importance of standards, libraries, tools, testing and evangelization!– Unicode including CLDR (genders, plurals, and bears, oh my!)– i18n QA/QE – Pseudo-localization

•Organizational models—Center of Excellence or decentralized – What to do if you don’t have an i18n architect or engineer– Links to online sources, people contacts, etc.

6

7

Internationalization = i18_lettersn

● i18N is the process of architecting, building and coding a product so that it can be localized without major engineering changes. It ensures that products are developed so that they are capable of supporting multiple languages, locales, regions, cultures, and conventions (i.e. currencies, laws, measurements etc.)

● Localization (L10n) is adapting a product to specific languages/locales by translating text and adding locale-specific formatting to images and style sheets

8

Think of i18n as underwear. While it may not be obvious at first glance if it’s missing – it will become more obvious and problematic over time if it’s missing – and you never want anyone to fixate on your lack of underwear!

● Enables a product to be sold on a global market● More efficient development of quality localized software

product● Faster time-to-market for localized software product● Consumes fewer resources, time and money for Engineering,

QE, and L10N● Reduces downstream bugs that your customers will see and

that your engineers will need to fix

9

• i18n level 1– Product runs on a non-English Operating System (OS) and

accepts non-English input and output (I/O)—critical for data integrity!

– Specific encoding/language is not assumed for sensitive elements• Database I/O• String parsing• User input in text field

• i18n level 2– Product correctly handles locale-specific items such as

date/time format, number format, time zone, currency, calendar differences

– Ideally, product gathers this data from the OS or the browser

• i18n level 3– Product is localizable: strings are gathered into some sort of

resource bundle (not “Hello World”!)

10

• Bi-directional text handling, for example, for Arabic and Hebrew

11

• Mirroring the interface

12

• Specific components of i18N in software development:–Character classification transliteration–Collation or sorting–Regular expressions– Encoding schemes–Character versus byte processing–Good coding practices such as concatenation, variable proliferation

– Platform i18n includes input method editors, fonts, etc.

13

• Unicode Compliance• Libraries like CLDR• i18n Standards• Static text analysis tools• Inclusion of i18n validation within your check-in, build, and QA

processes• i18n Training

13

14

• Before localization, alter the software strings so you can see if localization is likely to work– Programmatically add characters– Alter characters to by substituting non-English characters that

look similar. An example from Wikipedia:Account Settings

[!!! Àççôûñţ Šéţţîñĝš !!!] 1

1.From Benjamin Zadik (12 April 2013). "Pseudolocalization: Prepare your app for localization"

15

• i18n functional testing including L10n framework (ability to handle translated resource files)• Verify i18n code/implementation does not break existing

functionality• Verify i18n functionality works properly• Verify i18n readiness requirements are met before L10n

process starts

• L10n functional testing• Verify localized UI functionality and layout• Linguistic review can be a separate item

16

Examples• Install/uninstall product on supported OS locales• Verify proper display and functionality of input and output when using

non-ASCII (non-English) characters in text fields– Verify database stores data sets without any loss

• Enter data with locale-specific number format– Japanese -> date/time -> yyyy/MM/dd; H:mm:ss

• Locale detection is ready to display localized message/UI

Tools• Test repositories• Automated testing

– Basic acceptance tests (BAT)– Smoke tests (most important functions)– Regression tests– Example: SILK Test by Segue Software

• Graphical UI testing tools—simulators such as Alchemy Catalyst• Screen shot capture

17

Hardcoded strings

18

Truncation and UI issues

Date format issues

19

• Political issues– Countries that don’t recognize other countries– Border disputes--maps– Flags

• Defining emoji– Pertinent to Women in Localization--discussions such as:

should emoji representing professions include both women and men and represent all races? Should there be gender- and race-neutral emoji too?

20

Organizational models—Center of Excellence versus decentralized teams• What to do if you don’t have an i18n Architect or Engineer• Making the case for hiring an i18n engineer

Centralization • Truly accountable for getting upstream of our process• Can take ownership for central bugfixing, dashboards, tooling, etc. • Standards are easier• Can lead a cross-functional Tiger team to get buy-in

Decentralization and Tiger Teams• Buy-in can be stronger w/in product teams if they feel accountable• Engineers integrated within product – so more in the “flow” • Leader who unites a central decision making team can compensate• Inventing useless solutions

20

21

Prove your case – Start with your Bugs!!!

Dumpster dive your bugs/issues – categorize them & show the problem

21

Variables 22Feel local 13Linguistic 13Linguistic - need ENG 12Hardcoded strings 11Concatenated Strings 10Functional 10Functional - obsolete? 7UI Issues 7Date format 6Number format 6ENG Fixes 5Text in images 3Address format 2Broken links 2SUI Issues 2Videos 2Chart of Accounts 1Compliance 1Encoding 1Plurals - variables 1Missing keys 1New Country/Lang 1Time zone 1

Total 140

Bugs logged:

Linguistic 196Missing T9N 223UI Layout 171Functional 147

Total 737

• Apply standard QA metric costs – to fixing bugs early versus later in the development cycle (your QA team has this)

• Show what it looks like to your customer - Japanese is a great language to demonstrate with

• Invite experts to present, train or show the way (Unicode Consortium company participants)

22

• Your customers deserve a great product in their markets• Your company likely looks to your team to solve these

issues and most stakeholders can’t differentiate the source of the problem

• You may not be able to fix these issues directly - but you can identify and go after the solution

23

A great summary of key areas of variance (and kind of funny)https://www.youtube.com/watch?v=0j74jcxSunY

An cohort from my Google days - Manish…L10n/i18n overview https://www.youtube.com/watch?v=54BSTOzbc_o

Online sources, people contacts, Unicode consortium, etc. • Globalyzer by Lingoport – Adam Asnes http://lingoport.com/ • The I18n guy - Tex Texin www.i18nguy.com/• Unicode Consortium

– http://unicode.org/– Includes CLDR, Unicode Standard, tutorials, conferences

• Microsoft Go Global Developer Center– https://msdn.microsoft.com/en-us/goglobal/bb892890.aspx

• Search for “internationalization 101” or “internationalization basics”

24

25

26

• G11n Consulting/Engineering/Architect– Drive/Evangelize i18n best practices within the development

community – Assess i18n readiness of code– i18n/L10n enablement support– L10n integration support, L10n bug fixes

• G11n Quality Engineering– i18n testing - validate i18n support, cover i18n level 1, 2, 3 testing – L10n testing - validate L10n support, provide screen shots for linguistic

review

27

• Locale: – Operating System or browser environment that brings

together information about how to handle data specific to the user’s particular country or territory, for example time zone, currency, and language

• Unicode: – Character encoding that can represent 1.1 million code

points• Unicode Consortium:

– the organization accepted as a standards body for defining Unicode encodings, locales, and other data

• UTF-8 and UTF-16: – Specific Unicode encodings that use their own sequences

to represent characters/symbols; main difference is the number of bits used for each character.

• CLDR: – Common Locale Data Repository: A

2828

• Sentences are built in the code from fragments of sentences – when the language rules change, these fragments can’t be put together correctly

• Often these look like bad translations until we look into the code

29

Languages handle the concept of plurals differently. In English, we have• one cat, two cats• One cat is purring; two cats are purring• Can I pet it (one cat), can I pet them (two cats)

In Czech, it’s not a matter of one or more than one. • Cardinal numbers are categorized as 1, few (2-4), many

(0.0-1.5, 10.0, 100.0, 1000.0, etc.), and other (0, 51-19, 100, 1000, etc.)

So even simple concatenated strings are not easily translated.

29

30

• Since facture and opération are both feminine, the words in pink are changed to the feminine form also, so that they agree with the noun.

• Since rapport is masculine, the words in blue must be in the masculine form.

• As in English, there are special rules around nouns that start with a vowel, that affect the preceding word.(This happens more in French than in English.)

30

L’opération mémorisée a été enregistrée.

La facture mémorisée a été enregistrée.

Le rapport mémorisé a été enregistré.

31

• In this case, {doc} could stand for some of the following:

• What would those sentences look like?

sample=Le {doc} mémorisé a été enregistré.

(Translation: “The memorized {doc} has been saved.”)

opération(“transaction”)

rapport(“report”)

facture(“invoice”)

● Romance languages have the concept of gender.● Every noun has a gender, which can be masculine or feminine

(and in some languages, also neuter).● This gender affects the entire rest of the sentence.

32

• Check out this string - a variable smorgasbord!

• In order to translate this, it had to be re-coded to over sixty different strings to accommodate all the variations!

32

todo_txn_summary_desc={totalTxnCnt} {txn} totaling {totalAmountSpan} are {dueText}

#Bill strings for homepage todo#{totalTxnCnt} = numeric like 10#{totalAmountSpan} = numeric amount like 100.00#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.todo_bill_plural_summary_90_days={totalTxnCnt} bills totaling {totalAmountSpan} are 90 days past duetodo_bill_plural_summary_60_days={totalTxnCnt} bills totaling {totalAmountSpan} are 60 days past duetodo_bill_plural_summary_30_days={totalTxnCnt} bills totaling {totalAmountSpan} are 30 days past duetodo_bill_plural_summary_15_days={totalTxnCnt} bills totaling {totalAmountSpan} are 15 days past duetodo_bill_plural_summary_past_due={totalTxnCnt} bills totaling {totalAmountSpan} are past duetodo_bill_plural_summary_due_today={totalTxnCnt} bills totaling {totalAmountSpan} are due todaytodo_bill_plural_summary_due_tomorrow={totalTxnCnt} bills totaling {totalAmountSpan} are due by tomorrowtodo_bill_plural_summary_due_2_days={totalTxnCnt} bills totaling {totalAmountSpan} are due {weekday}todo_bill_plural_summary_due_on={totalTxnCnt} bills totaling {totalAmountSpan} are due on {dateString}todo_bill_plural_summary_to_do={totalTxnCnt} bills totaling {totalAmountSpan} are to do

#{linkToTxn} = http link to QBO page#{linkToName} = http link to QBO page#{name} = customer name associated with the single bill#{amountStr} = numeric amount like 100.00#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.#{action} = http link to an actiontodo_bill_plural_detail_90_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 90 days past due</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_60_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 60 days past due</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_30_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 30 days past due</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_15_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 15 days past due</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_past_due=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> past due</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_due_today=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due today</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_due_tomorrow=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due by tomorrow</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_due_2_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due {weekday}</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_due_on=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due on {dateString}</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>todo_bill_plural_detail_to_do=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Bill</a> for <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> to do</div><div class="actionInfo"><a onclick="{action}">Pay Bill</a></div></div>

#{linkToTxn} = http link to QBO page#{amountStr} = numeric amount like 100.00#{linkToName} = http link to QBO page#{name} = customer name associated with the single bill#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.todo_bill_singular_90_days=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is 90 days past duetodo_bill_singular_60_days=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is 60 days past duetodo_bill_singular_30_days=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is 30 days past duetodo_bill_singular_15_days=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is 15 days past duetodo_bill_singular_past_due=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is past duetodo_bill_singular_due_today=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is due todaytodo_bill_singular_due_tomorrow=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is due by tomorrowtodo_bill_singular_due_2_days=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is due {weekday}todo_bill_singular_due_on=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is due on {dateString}todo_bill_singular_to_do=<a onclick=\"{linkToTxn}\">Bill</a> for <span class='amount'>{amountStr}</span> for <a onclick=\"{linkToName}\">{name}</a> is to do

#Invoice strings for homepage todo#{totalTxnCnt} = numeric like 10#{totalAmountSpan} = numeric amount like 100.00#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.todo_invoice_plural_summary_90_days={totalTxnCnt} invoices totaling {totalAmountSpan} are 90 days past duetodo_invoice_plural_summary_60_days={totalTxnCnt} invoices totaling {totalAmountSpan} are 60 days past duetodo_invoice_plural_summary_30_days={totalTxnCnt} invoices totaling {totalAmountSpan} are 30 days past duetodo_invoice_plural_summary_15_days={totalTxnCnt} invoices totaling {totalAmountSpan} are 15 days past duetodo_invoice_plural_summary_past_due={totalTxnCnt} invoices totaling {totalAmountSpan} are past duetodo_invoice_plural_summary_due_today={totalTxnCnt} invoices totaling {totalAmountSpan} are due todaytodo_invoice_plural_summary_due_tomorrow={totalTxnCnt} invoices totaling {totalAmountSpan} are due by tomorrowtodo_invoice_plural_summary_due_2_days={totalTxnCnt} invoices totaling {totalAmountSpan} are due {weekday}todo_invoice_plural_summary_due_on={totalTxnCnt} invoices totaling {totalAmountSpan} are due on {dateString}todo_invoice_plural_summary_to_do={totalTxnCnt} invoices totaling {totalAmountSpan} are to do

#{linkToTxn} = http link to QBO page#{linkToName} = http link to QBO page#{name} = customer name associated with the single bill#{amountStr} = numeric amount like 100.00#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.#{action} = http link to an actiontodo_invoice_plural_detail_90_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 90 days past due</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_60_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 60 days past due</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_30_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 30 days past due</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_15_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> 15 days past due</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_past_due=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> past due</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_due_today=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due today</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_due_tomorrow=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due by tomorrow</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_due_2_days=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due {weekday}</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_due_on=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> due on {dateString}</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>todo_invoice_plural_detail_to_do=<div class="detailTxnTodo"><div class="txnInfo"><a onclick="{linkToTxn}">Invoice</a> to <a onclick="{linkToName}">{name}:</a></div><div class="dueInfo"><span class="amount">{amountStr}</span> to do</div><div class="actionInfo"><a onclick="{action}">Record payment</a></div></div>

#{linkToTxn} = http link to QBO page#{amountStr} = numeric amount like 100.00#{linkToName} = http link to QBO page#{name} = customer name associated with the single bill#{weekday} = Monday, Tuesday, Wednesday, etc.#{dateString} = yyyy/mm/dd, dd/mm/yyyy, mm/dd/yyyy, dd-mm-yyyy, etc.todo_invoice_singular_90_days=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is 90 days past duetodo_invoice_singular_60_days=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is 60 days past duetodo_invoice_singular_30_days=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is 30 days past duetodo_invoice_singular_15_days=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is 15 days past duetodo_invoice_singular_past_due=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is past duetodo_invoice_singular_due_today=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is due todaytodo_invoice_singular_due_tomorrow=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is due by tomorrowtodo_invoice_singular_due_2_days=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is due {weekday}todo_invoice_singular_due_on=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is due on {dateString}todo_invoice_singular_to_do=<a onclick=\"{linkToTxn}\">Invoice</a> for <span class='amount'>{amountStr}</span> to <a onclick=\"{linkToName}\">{name}</a> is to do

33

Address - US

Data Type

Address - Russia

Data Type Address - India

Data Type

8423 11th ave SW

Address + Street

ul. Pobedy, d. 20, kv. 29

Street + Address

A-205 Natasha Golf View

Address

San Francisco

City pos. Oktyabrskiy

City 2 Inner Ring Road

Street

California State Borskiy r-n Sub-Region Domlur Locality

94127 postal code

Nizhegorodskaya obl.

Region Bangalore City

USA Country Russia Country 560071 Postcode

606480 Postcode Karnataka State

India Country

33

Basic address format - (Libraries are good solution)