Language File (.85)

The Language File Version 2 project added upgrades to File Manager's Language file (.85) and related software to help WorldVistA EHR 2.0 meet the EHR certification standards required by meaningful use stage one and two.

TL;DR Summary: Go here to download and install the file: Installing_the_Language_File_Version_2

Background for the Language File Version 2
back: VistA_Meaningful_Use_Enhancements

Meaningful-use Requirement
Stage one of meaningful use include a core objective that users be able to Record demographic information, including preferred language, gender, race, ethnicity, date of birth, and date and preliminary cause of death in the event of mortality in the eligible hospital. Stage one includes a corresponding core measure that more than 50% of all unique patients seen by the eligible professional (EP) or admitted to the eligible hospital (EH) have demographics as Recorded structured data.

Here is the precise wording about these core objectives from the Federal Register, Vol. 75, No. 8, Wednesday, January 13, 2010, Rules and Regulations:

"C. Standards, Implementation Specifications, and Certification Criteria Processes Before and After the HITECH Act . . . "2. HITECH Act Requirements for the Adoption of Standards, Implementation Specifications, and Certification Criteria. . . "Once the National Coordinator accepts a recommendation for the priority order of standards, implementation specifications, and certification criteria, such priorities will be communicated to the HIT Standards Committee to guide its work. The HIT Policy Committee is charged with making recommendations in at least the following eight areas as specified in section 3002(b)(2)(B) of the PHSA: . . . "(7) The use of electronic systems to ensure the comprehensive collection of patient demographic data, including, at a minimum, race, ethnicity, primary language, and gender information; ". . . "TABLE 1—CERTIFICATION CRITERIA. . . "Proposed meaningful use Stage 1 objectives: F demographics [4] [5] "Certification criteria to support the achievement of meaningful use Stage 1 by eligible professionals: Enable a user to electronically Record, modify, and retrieve patient demographic data in- cluding preferred language, insurance type, gender, race, ethnicity, and date of birth. "Certification criteria to support the achievement of meaningful use Stage 1 by eligible hospital: Enable a user to electronically Record, modify, and retrieve patient demographic data in- cluding preferred language, insurance type, gender, race, ethnicity, date of birth, and date and cause of death in the event of mortality.' "[4] For eligible professionals the full proposed meaningful use Stage 1 objective is: 'Record demographics: preferred language, insurance type, gender, race, ethnicity, date of birth.' "[5] For eligible hospitals the full proposed meaningful use Stage 1 objective is: 'Record demographics: preferred language, insurance type, gender, race, ethnicity, date of birth, date and cause of death in the event of mortality.' ".. . "§ 170.304	Specific certification criteria for Complete EHRs or EHR Modules designed for an ambulatory setting. "The Secretary adopts the following certification criteria for Complete EHRs or EHR Modules designed to be used in an ambulatory setting. Complete EHRs or EHR Modules must include the capability to perform the following functions electronically and in accordance with all applicable standards and implementation specifications adopted in this part:. . . "(c) Record demographics. Enable a user to electronically Record, modify, and retrieve patient demographic data including preferred language, insurance type, gender, race, ethnicity, and date of birth. ".. . "§ 170.306	Specific certification criteria for Complete EHRs or EHR Modules designed for an inpatient setting. "The Secretary adopts the following certification criteria for Complete EHRs or EHR Modules designed to be used in an inpatient setting. Complete EHRs or EHR Modules must include the capability to perform the following functions electronically and in accordance with all applicable standards and implementation specifications adopted in this part:. . . "(b) Record demographics. Enable a user to electronically Record, modify, and retrieve patient demographic data including preferred language, insurance type, gender, race, ethnicity, date of birth, and date and cause of death in the event of mortality."

Prior to WorldVistA EHR 2.0, VISTA did not include anything like a preferred language field attached to patients, nor did it include the necessary options to set or modify it. This part of the project was about resolving this deficiency to help WorldVistA EHR 2.0 become a certified EHR hospitals could use to meet meaningful use stage one.

Architectural Base
VISTA has included a Language file (#.85) since the 1994 release of version 21 of the File Manager (aka Fileman) package. Fileman 21 included numerous features designed to introduce true multi-lingual capabilities into VISTA. The Fileman team at the time intended to follow this up with further enhancements in the subsequent versions of Fileman and to assist the primary-development teams responsible for all other VISTA packages in shifting to this new internationalization framework. Unfortunately, their work was interrupted when the U.S. Department of Veterans Affairs (VA) chose to break up the File Manager development team, leaving VISTA database development at a crawl for the subsequent fifteen years. As a result, there was a Language file to build from for this WorldVistA EHR 2.0 project, but it was far more rudimentary than it was intended to be by its designers.

The first version of the Language file was created by Marcus Werners, who at the time was the technical lead for the VISTA implementation at the German Heart Institute of Berlin. He was motivated by the problem of having to repeatedly translate new versions of VISTA packages into German. He spent his multi-week annual vacation one year in the early 1990s working side by side with the File Manager team in San Francisco to develop File Manager's internationalization framework, including the design of this file. The other members of the team were Maureen Hoye, Tami Winn, Danila Manapsal, Michael Ogi, Don Creaven, David LaLiberte, and Rick Marshall, all of whom were involved in the brainstorming sessions with Mr. Werners, though the principal design work was his.

Existing File's Data Dictionary
Here is the data dictionary of the existing Language file presented three ways: first, a global map that shows where the data is stored in MUMPS; second, a condensed listing that summarizes the fields; and finally a standard listing that includes all the details about the file definition:

GLOBAL MAP DATA DICTIONARY #.85 -- LANGUAGE FILE            12/27/11    PAGE 1 STORED IN ^DI(.85, (11 ENTRIES)   SITE: VISTA Forum   UCI: LIVE,FORUM (VERSION 22.0)    --- The LANGUAGE file is used both to officially identify a language, and to store MUMPS code needed to do language-specific conversions of data such as dates and numbers.  VA FileMan currently distributes only the English language entry for this file (entry number 1).  This code is currently available for use only within VA FileMan.  A pointer to this file from the TRANSLATION multiple on the DIALOG file also allows non-English text to be returned via FileMan calls.   CROSS REFERENCED BY: ID NUMBER(B), NAME(C) ^DI(.85,D0,0)= (#.01) ID NUMBER [1N] ^ (#1) NAME [2F] ^  ^DI(.85,D0,20.2)= (#20.2) DATE INPUT [E1,245K] ^  ^DI(.85,D0,CRD)= (#10.3) CARDINAL NUMBER FORMAT [E1,245K] ^  ^DI(.85,D0,DD)= (#10.2) DATE/TIME FORMAT [E1,245K] ^  ^DI(.85,D0,FMTE)= (#10.21) DATE/TIME FORMAT (FMTE) [E1,245K] ^  ^DI(.85,D0,LC)= (#10.5) LOWERCASE CONVERSION [E1,245K] ^ ^DI(.85,D0,MSCISO)= (#21400) CODE [1F] ^ ^DI(.85,D0,ORD)= (#10.1) ORDINAL NUMBER FORMAT [E1,245K] ^ ^DI(.85,D0,TIME)= (#10.22) TIME [E1,245K] ^ ^DI(.85,D0,UC)= (#10.4) UPPERCASE CONVERSION [E1,245K] ^

CONDENSED DATA DICTIONARY---LANGUAGE FILE (#.85)UCI: LIVE,FORUM  VERSION: 22.0 STORED IN: ^DI(.85,                                      DEC 27,2011 PAGE 1                                                  FILE SECURITY                                   DD SECURITY    : ^     DELETE SECURITY: ^                                   READ SECURITY  :       LAYGO SECURITY : ^                                   WRITE SECURITY : ^ CROSS REFERENCED BY:       ID NUMBER(B)  NAME(C)                                  FILE STRUCTURE FIELD     FIELD NUMBER    NAME .01       ID NUMBER (RNJ10,0X), [0;1] 1         NAME (RF), [0;2] 10.1      ORDINAL NUMBER FORMAT (K), [ORD;E1,245] 10.2      DATE/TIME FORMAT (K), [DD;E1,245] 10.21     DATE/TIME FORMAT (FMTE) (K), [FMTE;E1,245] 10.22     TIME (K), [TIME;E1,245] 10.3      CARDINAL NUMBER FORMAT (K), [CRD;E1,245] 10.4      UPPERCASE CONVERSION (K), [UC;E1,245] 10.5      LOWERCASE CONVERSION (K), [LC;E1,245] 20.2      DATE INPUT (K), [20.2;E1,245]

STANDARD DATA DICTIONARY #.85 -- LANGUAGE FILE              12/27/11    PAGE 1 STORED IN ^DI(.85, (11 ENTRIES)   SITE: VISTA Forum   UCI: LIVE,FORUM (VERSION 22.0)    DATA          NAME                  GLOBAL        DATA ELEMENT       TITLE                 LOCATION      TYPE --- IDENTIFIED BY: NAME (#1)[R] POINTED TO BY:               LANGUAGE field (#.01) of the TRANSLATION sub-field (#.847) of                    the DIALOG File (#.84)                LANGUAGE field (#200.07) of the NEW PERSON File (#200)                DEFAULT LANGUAGE field (#207) of the KERNEL SYSTEM PARAMETERS                    File (#8989.3)  CROSS REFERENCED BY: ID NUMBER(B), NAME(C) .85,.01       ID NUMBER              0;1 NUMBER (Required)              Language-ID-Number                      INPUT TRANSFORM:  K:+X'=X!(X>9999999999)!(X<1)!(X?.E1"."1N.N) X S                                :$G(X) DINUM=X              LAST EDITED:      MAY 24,1994               HELP-Prompt:      Type a Number between 1 and 9999999999, 0 Decimal Digits DESCRIPTION:     A number that is used to uniquely identify a                                language. This number corresponds to the FileMan system variable DUZ("LANG"), which is                               set during Kernel signon to signify which language FileMan should use. NOTES:           XXXX--CAN'T BE ALTERED EXCEPT BY PROGRAMMER CROSS-REFERENCE: .85^B 1)= S ^DI(.85,"B",$E(X,1,30),DA)=""                               2)= K ^DI(.85,"B",$E(X,1,30),DA) .85,1        NAME                   0;2 FREE TEXT (Required) Language-Name INPUT TRANSFORM: K:$L(X)>30!($L(X)<1) X              LAST EDITED:      MAY 24,1994 HELP-Prompt:     Answer must be 1-30 characters in length. (e.g., ENGLISH, GERMAN, FRENCH) DESCRIPTION:     The descriptive name of the language corresponding to this entry (i.e., German,                               Spanish). TECHNICAL DESCR: Descriptive name of this language (e.g.,                                ENGLISH, GERMAN). CROSS-REFERENCE: .85^C 1)= S ^DI(.85,"C",$E(X,1,30),DA)=""                               2)= K ^DI(.85,"C",$E(X,1,30),DA) .85,10.1     ORDINAL NUMBER FORMAT  ORD;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 7,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to transfer a number in Y to                                its ordinal equivalent in this language. The code should set Y to the ordinal equivalent without altering any other variables in the environment. Ex. in English: Y=1    becomes         Y=1ST Y=2    becomes         Y=2ND Y=3    becomes         Y=3RD  etc. .85,10.2     DATE/TIME FORMAT       DD;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 7,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to transfer a date or date/time in Y from FileMan internal format, to printable format equivalent to English MMM DD,YYYY@HH.MM.SS. The code should set Y to the output, without altering any other variables in                               the environment. Ex. in English: Y=2940612.031245       becomes Y=JUN 12,1994@03:12:45 .85,10.21    DATE/TIME FORMAT (FMTE) FMTE;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     JUN 24,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to transfer a date or date/time in Y from FileMan internal format, to printable format based on the various outputs from routine FMTE^DILIBF. This is an extrinsic function. Coming in to this MUMPS code, in                               addition to the internal date in Y, a third parameter will be defined to contain flags equivalent to the flag passed as the second input parameter to FMTE^DILIBF. The code should set Y to the output, without altering any other variables in the environment. The output should be formatted based on these flags: 1   MMM DD, YYYY@HH:MM:SS 2   MM/DD/YY@HH:MM:SS     no leading zeroes on month,day 3   DD/MM/YY@HH:MM:SS     no leading zeroes on month,day 4   YY/MM/DD@HH:MM:SS 5   MMM DD,YYYY@HH:MM:SS  no space before year,no leading zero on day 6   MM-DD-YYYY @ HH:MM:SS spaces separate time 7   MM-DD-YYYY@HH:MM:SS   no leading zeroes on month,day letters in the flag S   return always seconds U   return uppercase month names P   return time as am,pm D   return only date part .85,10.22    TIME                   TIME;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 18,1996 HELP-Prompt:     This is Standard MUMPS code for the output of                                 time only. DESCRIPTION:     The code stored here will be used to get formatted output of the time part belonging to                               a FileMan Date/Time value. .85,10.3     CARDINAL NUMBER FORMAT CRD;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 8,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to transfer a number in Y to                                its cardinal equivalent in this language. The code should set Y to the cardinal equivalent without altering any other variables in the environment. Ex. in English: Y=2000    becomes         Y=2,000 Y=1234567 becomes         Y=1,234,567 .85,10.4     UPPERCASE CONVERSION   UC;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 8,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to convert text in Y to its upper-case equivalent in this language. The code should set Y to the external format without altering any other variables in the environment. In English, changes abCdeF     to: ABCDEF .85,10.5     LOWERCASE CONVERSION   LC;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     MAR 8,1994 HELP-Prompt:     This is Standard MUMPS code. DESCRIPTION:     MUMPS code used to convert text in Y to its lower-case equivalent in this language. The code should set Y to the external format without altering any other variables in the environment. In English, changes: ABcdEFgHij        to:  abcdefghij .85,20.2     DATE INPUT             20.2;E1,245 MUMPS INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM LAST EDITED:     JUL 14,1994 HELP-Prompt:     This is Standard MUMPS code.

Existing File's Data
In the beginning, entries were created only for the language of the different nations where the team was aware File Manager was being used at the time. Most of the entries were left as placeholders to be filled in by expert VISTA adopters from those nations, but the team felt comfortable filling in English and German in detail, given their makeup.

Record number 10 was assigned to Arabic in gratitude for and recognition of the Arab scholars who introduced the concept of the number 0 to Europe (along with the rest of the Arabic numbering system). This assignment is important to the discussion that follows because it is the sole reason why this file has an ID Number field. As shown in the file's data dictionary above, the ID Number field (.001) is the internal Record number exposed as a user-visible field. Usually this is done only when the Recordnumber is meaningful to an end user. In this case it is not; it has no significance at all, except that by adding it the team was able to ensure that Arabic was made language #10.

The entries for Russian, Greek, and Hebrew were added later.

LANGUAGE List                                        DEC 27,2011@14:10   PAGE 1 ID NUMBER: 1                           NAME: ENGLISH CARDINAL NUMBER FORMAT: I Y S Y=$FN(Y,",") DATE/TIME FOR: S:Y Y=$S($E(Y,4,5):$P("JAN^FEB^MAR^APR^MAY^JUN^JUL^AUG^SEP^OCT^ NOV^DEC","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+ 1700)_$P("@"_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14) ,1:""),"^",Y[".") DATE/TIME FORMAT (FMTE): N RTN,%T S %T="."_$E($P(Y,".",2)_"000000",1,7),%F=$G( %F),RTN="F"_$S(%F<1:1,%F>7:1,1:+%F\1)_"^DILIBF" D @RTN S Y=%R LOWERCASE CONVERSION: S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnop qrstuvwxyz") ORDINAL NUMBER FORMAT: I $G(Y) S Y=Y_$S(Y#10=1&(Y#100-11):"ST",Y#10=2&(Y#100-1 2):"ND",Y#10=3&(Y#100-13):"RD",1:"TH") TIME: S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14) :":"_$E(Y_0,13,14),1:""),1:"") UPPERCASE CONVERSION: S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOP QRSTUVWXYZ")

ID NUMBER: 2                           NAME: GERMAN CARDINAL NUMBER FORMAT: S:$G(Y) Y=$TR($FN(Y,","),",",".") DATE/TIME FORMAT: S:Y Y=$S($E(Y,6,7):$E(Y,6,7)_".",1:"")_$S($E(Y,4,5):$E(Y,4,5 )_".",1:"")_($E(Y,1,3)+1700)_$P(" "_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,1 3,14):":"_$E(Y_0,13,14),1:""),"^",Y[".") LOWERCASE CONVERSION: S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\","abcdefghijklm nopqrstuvwxyz{}|")                     ORDINAL NUMBER FORMAT: S:$G(Y) Y=Y_"." TIME: S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14) :":"_$E(Y_0,13,14),1:""),1:"") UPPERCASE CONVERSION: S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz{}|","ABCDEFGHIJKLM NOPQRSTUVWXYZ[]\")

ID NUMBER: 3                           NAME: SPANISH

ID NUMBER: 4                           NAME: FRENCH

ID NUMBER: 5                           NAME: FINNISH DATE/TIME FORMAT: X:$G(Y) ^DD("DD")  ORDINAL NUMBER FORMAT: I $G(Y) S Y=Y_"."

ID NUMBER: 6                           NAME: ITALIAN

ID NUMBER: 7                           NAME: PORTUGUESE

ID NUMBER: 10                          NAME: ARABIC

ID NUMBER: 11                          NAME: RUSSIAN

ID NUMBER: 12                          NAME: GREEK

ID NUMBER: 18                          NAME: HEBREW

Design Intentions
This version of the file was intended mainly to be used to assist in the process of translating all of VISTA's hard-coded text (such as in user prompts, help, and so on) into other languages so it could be used by non-English-speaking users. The only database pointers to the Language file are from (1) the Dialog file (#.84), which contains the canned text to be translated along with any translations, (2) the Kernel System Parameters file (8989.3), to allow the default language of the VISTA system to be set, and (3) the New Person file (200), to allow individual users to be set to a different language than the overall system.

In addition, the Kernel package during user sign-on would set the local variable DUZ("LANG") to a user's language, so that File Manager would offer dialog in that language wherever available. The intent was for packages to replace their hard-coded MUMPS write commands with calls to an API that would fetch the correct piece of dialog from the Dialog file, automatically translating it whenever DUZ("LANG") told it to. Because of the chaos in VISTA strategy and coordination over the past fifteen years, only two VISTA packages, File Manager and Mail Manager, have been converted so far to the use of this new internationalization framework. It remains a high priority for any future VISTA work to follow their example, not just to support multilingual use of VISTA but also because the same calls that support this also support separating the business logic from the user interface (UI), a necessary step in making it possible to convert VISTA Applications to next-generation UIs like browsers and mobile devices.

The work to convert File Manager to the Dialog framework was done partly by VA's 1990s File Manager development team (named above), but especially by George Timson in his subsequent MSC Fileman work. The work to convert Mail Manager to the Dialog framework was done single-handedly by Gary Beuschel.

Improvements in Medsphere Fileman
George Timson, the original author of File Manager, made significant enhancements to File Manager after the U.S. Department of Veterans Affairs released version 22 (the last version of Fileman officially released so far). This work was done for and paid by various clients but especially by Medsphere Corporation. Included in this work were significant improvements to Fileman's internationalization framework, which gave Mr. Timson the ability to convert many of File Manager's unique elements of dialog (such as file and field names, word-processing values, and so on) over to the enhanced internationalization framework so they could be translated as well. Many files (including Fileman's own data dictionary, file #0) were pointed to the Language file, and a new Code field was added. In a more recent upgrade, Mr. Timson added separate fields for two-letter and three-letter codes, to be used to Record the ISO 639 codes for languages.

Unfortunately, to date neither VA nor Indian Health Service (IHS) has adopted these extensions to File Manager. Therefore, they are not part of the VA's Freedom of Information Act (FOIA) release, and consequently neither are they the basis for WorldVistA EHR. Therefore, upgrading WorldVistA EHR to version 2.0 so it could be certified and so its adopters could attest to meaningful use had to be done independently of Mr. Timson's work.

For the brief present, Mr. Timson's work represents a fork, an alternative (and in most ways superior) dialect of File Manager. As described below, the full plans for this project include eventually synchronizing Mr. Timson's MSC Fileman solution to the language file with WorldVistA EHR 2.0's solution, to make it possible to later resolve the fork by adopting Mr. Timson's work into the WorldVistA EHR codebase. For now, their Language files will remain out of sync, making it problematic for the adopter of either to install the other.

Later in this project, as it moves toward the synchronization phase, this page will be expanded to compare MSC File Manager to WorldVistA EHR 2.0 File Manager in enough detail to guide the reunification.

UPDATE: As of November 2012, the various changes to Fileman from different adopters will be convereged to Fileman 22.2, the successor to MSC Fileman, which will be adopted by the VA. As part of these, the Language file designed by Rick Marshall including fields for ISO 639-1 and ISO 639-2 will be the same between WV and MSC Fileman.

Problems with Existing Architecture
The problems with the architecture before WorldVistA EHR 2.0 were these:

1) First, the Patient file needs to point to the Language file, but it did not.

2) Second, Chris Richardson rightly concluded that although meaningful use stage one only requires a single field to Record preferred language, to be truly useful it should also include a multiple that Records all the languages the patient knows, separately including how well they understand, speak, read, and write the language. Communicating with non-English-speaking people can often require round-about methods; after all, what if no one in the hospital speaks a patient's preferred language? If someone happens to speak an additional language they speak, you can still communicate with them. Likewise, some speakers of different dialects of Chinese cannot communicate through speech but can understand each other perfectly in writing. Tracking all four sets of skills for all languages a patient can speak is essential to maximizing the chances of communication, which is the spirit of this meaningful use stage one goal. The existing file also lacked such a subfile.

3) The main options used to edit and report patient demographics did not include these new fields.

4) The Language file itself contained only eleven languages. It needed its contents to be massively upgraded.

5) Although users refer to language by name, software prefers to refer to language by unique codes. Although such coding systems exist for languages, the existing data dictionary included no such coding fields.

6) Coding systems change over time. Tying a permanent hub file like Language to a specific generation of codes makes it impossible to keep track of changes to those codes over time. Some other file would be needed to keep track of the language codes themselves

7) The biggest problem with the existing file dates back to the decision to include Arabic. To make it easy to make Arabic language #10, the team made the key of the file be the Record's internal entry number. When VA broke up the File Manager team, it de facto converted this temporary expediency into the permanent condition of the file, with the file's scaffolding released into production. The result is that pointers to the Language file from other files do not resolve as the name of the language but as its number, making it nearly useless to end users and meeting neither the spirit nor the letter of the meaningful use stage one goal.

To meet meaningful use stage one, all these problems had to be solved.

Components of Language File Version 2
The following seven changes make up this project:

1) Added Language Preference field (256000) to Patient file (2).

2) Added Language Skills subfile (256001/2.0256001) to Patient file (2).

3) Tertiary modifications to the primary options that edit and display patient demographic information.

4) Hundreds of new entries added to the Language file (.85).

5) New code fields added to the Language file (.85).

6) New VW HL7 Tables file (260).

7) Overhaul of data dictionary of the Language file (.85)

Patient File: Language Preference Field
This is the new field added to the Patient file (2) to support the letter of the preferred-language requirement of meaningful use stage one:

STANDARD DATA DICTIONARY #2 -- PATIENT FILE       DEC 27,2011@19:09:49  PAGE 1 STORED IN ^DPT( (58806 ENTRIES)   SITE: Oroville Hospital Development   UCI: DEV,VISTA                                                        (VERSION 5.3)    DATA          NAME                  GLOBAL        DATA ELEMENT       TITLE                 LOCATION      TYPE --- 2,256000      LANGUAGE PREFERENCE    256000;1 POINTER TO LANGUAGE FILE (#.85)              LAST EDITED:      JUN 22, 2011               DESCRIPTION:      This field is to define the language preference                                of the patient.       FILES POINTED TO                      FIELDS LANGUAGE (#.85)                   LANGUAGE PREFERENCE (#256000)                                   LANGUAGE SKILLS:LANGUAGE SKILLS (#.01)

This field was created by Chris Richardson.

Patient File: Language Skills Subfile
On 20 December 2010, Nancy Anthracite pointed the team to appendix A of the HL7 tables, which includes standards for language ability and language proficiency:

Language Ability 1 Read 2 Write 3 Speak 4 Understand 5 Sign Language Proficiency 1 Excellent 2 Good 3 Fair 4 Poor 5 Some(level unknown)

In designing the subfile for the Patient file, Chris Richardson approximated these two standards but modified them. He changed the order of the abilities and omitted signing. He also changed the order of the proficiencies, replaced them with more specific and intuitive names where possible, followed the VISTA convention of eschewing numeric codes in favor of more user-friendly alphabetic ones, and omitted "some (level unknown)". Here is the resulting data dictionary for the new subfile:

STANDARD DATA DICTIONARY #2 -- PATIENT FILE       DEC 27,2011@19:09:49  PAGE 1 STORED IN ^DPT( (58806 ENTRIES)   SITE: Oroville Hospital Development   UCI: DEV,VISTA                                                        (VERSION 5.3)    DATA          NAME                  GLOBAL        DATA ELEMENT       TITLE                 LOCATION      TYPE --- 2,256001      LANGUAGE SKILLS        256001;0 POINTER Multiple #2.0256001              DESCRIPTION:      The languages listed here are associated with a                                series of qualifiers for UNDERSTANDING,                                SPEAKING, READING, and/or WRITTEN skill levels                                of each langua language specified for this                                patient.   2.0256001,.01   LANGUAGE SKILLS        0;1 POINTER TO LANGUAGE FILE (#.85)                                   (Multiply asked)                LAST EDITED:      MAY 24, 2011                 DESCRIPTION:      This multiple is to help catalog the language skills of the patient. It may be the case that a patient may be called upon to                                 communicate with other patients that the staff is unable to communicate with otherwise. CROSS-REFERENCE: 2.0256001^B 1)= S ^DPT(DA(1),256001,"B",$E(X,1,30),DA)=""                                 2)= K ^DPT(DA(1),256001,"B",$E(X,1,30),DA) 2.0256001,1    UNDERSTANDING SKILL LEVEL 0;2 SET 'P' FOR poor to none; 'I' FOR intermediate; 'N' FOR native skills; 'M' FOR mastery of the Language; LAST EDITED:     MAY 24, 2011 2.0256001,2    SPEAKING SKILL LEVEL   0;3 SET 'P' FOR poor to none; 'I' FOR intermediate; 'N' FOR native skills; 'M' FOR mastery of the Language; LAST EDITED:     MAY 24, 2011 2.0256001,3    READING SKILL LEVEL    0;4 SET 'P' FOR poor to none; 'I' FOR intermediate; 'N' FOR native skills; 'M' FOR mastery of the Language; LAST EDITED:     MAY 24, 2011 2.0256001,4    WRITTEN SKILL LEVEL    0;5 SET 'P' FOR poor to none; 'I' FOR intermediate; 'N' FOR native skills; 'M' FOR mastery of the Language; LAST EDITED:     MAY 24, 2011 FILES POINTED TO                     FIELDS LANGUAGE (#.85)    LANGUAGE SKILLS:LANGUAGE SKILLS (#.01)

This subfile was created by Chris Richardson. Greg Woodhouse and Nancy Anthracite helped brainstorm the actual representation with him.

Use of the Interpreter Language subfile (19906/2.019906)
WorldVistA EHR 1.0 includes a subfile that is used for this project. Here is its complete data dictionary:

STANDARD DATA DICTIONARY #2.019906 -- INTERPRETER LANGUAGE SUB-FILE DEC 27,2011@18:16:57 PAGE 1 STORED IN ^DPT(D0,19901,  SITE: Oroville Hospital Development   UCI: DEV,VISTA DATA          NAME                  GLOBAL        DATA ELEMENT       TITLE                 LOCATION      TYPE --- CROSS REFERENCED BY: INTERPRETER LANGUAGE(B) 2.019906,.01  INTERPRETER LANGUAGE   0;1 POINTER TO LANGUAGE FILE (#.85)                                 (Multiply asked)              OUTPUT TRANSFORM: S Y=$$GET1^DIQ(.85,Y,1,"")              LAST EDITED:      MAY 09, 2005               HELP-PROMPT:      English is the default Language if no other                                 Language is entered.  If others are entered and                                the patient speaks English as well, ENGLISH                                 must be included in this field.               CROSS-REFERENCE:  2.019906^B                                 1)= S ^DPT(DA(1),19901,"B",$E(X,1,30),DA)="" 2)= K ^DPT(DA(1),19901,"B",$E(X,1,30),DA)     FILES POINTED TO                      FIELDS LANGUAGE (#.85)                   INTERPRETER LANGUAGE (#.01)

This field, along with the other 19900-numberspaced fields, was created by Brian Lord at Daou Systems in 2005 as part of the Centers for Medicare and Medicaid Services's (CMS's) VistA-Office EHR (VOE) project. This was a project to modify VA's FOIA VISTA to create a dialect of VISTA preconfigured for small clinics and doctor's offices. It was inspired by studies showing the high rate of medical error in the United States and the promise of EHRs to drive down those errors; EHR uptake was especially low in small clinics and doctor's offices, so CMS wanted to create a free EHR they could adopt. The project was crushed when EHR vendors got wind of it, which interrupted the plans for this subfile along with everything else. Since this work predates meaningful use, it was originally added not to comply with MU stage one but to meet CMS's design requirements for the VOE project.

Note the use of the field's output transform to overcome the difficulty with pointers to the existing Language file resolving to language number rather than name. Also note the better-than-average help prompt. Although unfinished, this subfile was a good start on solving the problem.

At some point, the remaining 19900-numberspaced fields need to be analyzed as well for whether they are in use and whether they should be finished or removed.

The field is asked in WorldVistA 2.0 registration, but not displayed in any place except patient registration.

Language File: New Entries
The contents of the upgraded Language file (.85) were based on the contents of IHS's Language file (9999999.99), at the suggestion of Nancy Anthracite, Ben Mehling, and Fay Stubble. According to Ms. Stubble the IHS file's contents were based on ISO 639-2 (http://www.loc.gov/standards/iso639-2/ascii_8bits.html), and according to Mr. Mehling Medsphere OpenVistA would use the same contents, so Ms. Anthracite chose to do likewise on 8 December 2010.

NOTE: Correction. This is what RPMS actually says: This file reflects entries in the U.S. Census Bureau's 2000 ACS 1-year & 2001 ACS 1-year PUMS Language Codes table (accessible at http://www.census.gov/acs/www/Products/PUMS/C2SS/CodeList/2000-2001/Language.htm). Local additions or modifications should not be made.

Rick Marshall advised WorldVistA to upgrade File Manager's Language file (.85) instead of the IHS Language file, because language is too central to the emerging new VISTA architecture to have it stored in a peripheral file, especially when file .85 was already present to be used. Although the ISO 639 (http://en.wikipedia.org/wiki/ISO_639) standards had already been extended up through ISO 639-5, WorldVistA decided to restrict this upgrade to ISO 639-1 and 2 to maximize WorldVistA EHR 2.0's compatibility with RPMS and Medsphere OpenVistA.

Chris Richardson populated the file with data loaded from a spreadsheet containing the ISO 639-1 and 2 data on 21 December 2010.

LANGUAGE LIST                                 JAN 22,2012  19:45    PAGE 1 NAME: ENGLISH                          THREE LETTER CODE: ENG TWO LETTER CODE: EN  CARDINAL NUMBER FORMAT: I Y S Y=$FN(Y,",") DATE/TIME FOR: S:Y Y=$S($E(Y,4,5):$P("JAN^FEB^MAR^APR^MAY^JUN^JUL^AUG^SEP^OCT^NOV^DEC","^",+$E(Y,4,5))_" ",1:"")_$S($E(Y,6,7):+$E(Y,6,7)_",",1:"")_($E(Y,1,3)+1700)_$P("@"_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".") DATE/TIME FORMAT (FMTE): N RTN,%T S %T="."_$E($P(Y,".",2)_"000000",1,7),%F=$G(%F),RTN="F"_$S(%F<1:1,%F>7:1,1:+%F\1)_"^DILIBF" D @RTN S Y=%R LOWERCASE CONVERSION: S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz") ORDINAL NUMBER FORMAT: I $G(Y) S Y=Y_$S(Y#10=1&(Y#100-11):"ST",Y#10=2&(Y#100-12):"ND",Y#10=3&(Y#100-13):"RD",1:"TH") TIME: S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"") UPPERCASE CONVERSION: S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") NAME: GERMAN                           THREE LETTER CODE: GER TWO LETTER CODE: DE  CARDINAL NUMBER FORMAT: S:$G(Y) Y=$TR($FN(Y,","),",",".") DATE/TIME FORMAT: S:Y Y=$S($E(Y,6,7):$E(Y,6,7)_".",1:"")_$S($E(Y,4,5):$E(Y,4,5)_".",1:"")_($E(Y,1,3)+1700)_$P(" "_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),"^",Y[".") LOWERCASE CONVERSION: S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\","abcdefghijklmnopqrstuvwxyz{}|")                     ORDINAL NUMBER FORMAT: S:$G(Y) Y=Y_"." TIME: S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14):":"_$E(Y_0,13,14),1:""),1:"") UPPERCASE CONVERSION: S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz{}|","ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\") NAME: SPANISH                          THREE LETTER CODE: SPA TWO LETTER CODE: ES NAME: FRENCH                           THREE LETTER CODE: FRE TWO LETTER CODE: FR NAME: FINNISH                          THREE LETTER CODE: FIN TWO LETTER CODE: FI                  DATE/TIME FORMAT: X:$G(Y) ^DD("DD") ORDINAL NUMBER FORMAT: I $G(Y) S Y=Y_"." NAME: ITALIAN                          THREE LETTER CODE: ITA TWO LETTER CODE: IT NAME: PORTUGUESE                       THREE LETTER CODE: POR TWO LETTER CODE: PT NAME: ARABIC                           THREE LETTER CODE: ARA TWO LETTER CODE: AR NAME: RUSSIAN                          THREE LETTER CODE: RUS TWO LETTER CODE: RU NAME: GREEK                            THREE LETTER CODE: GRE TWO LETTER CODE: EL NAME: HEBREW                           THREE LETTER CODE: HEB TWO LETTER CODE: HE NAME: AFAR                             THREE LETTER CODE: AAR TWO LETTER CODE: AA NAME: ABKHAZIAN                        THREE LETTER CODE: ABK TWO LETTER CODE: AB NAME: ACHINESE                         THREE LETTER CODE: ACE NAME: ACOLI                            THREE LETTER CODE: ACH NAME: ADANGME                          THREE LETTER CODE: ADA NAME: ADYGHE                           THREE LETTER CODE: ADY NAME: AFRO-ASIATIC LANGUAGES           THREE LETTER CODE: AFA NAME: AFRIHILI                         THREE LETTER CODE: AFH NAME: AFRIKAANS                        THREE LETTER CODE: AFR TWO LETTER CODE: AF NAME: AINU                             THREE LETTER CODE: AIN NAME: AKAN                             THREE LETTER CODE: AKA TWO LETTER CODE: AK NAME: AKKADIAN                         THREE LETTER CODE: AKK NAME: ALBANIAN                         THREE LETTER CODE: ALB TWO LETTER CODE: SQ NAME: ALEUT                            THREE LETTER CODE: ALE NAME: ALGONQUIAN LANGUAGES             THREE LETTER CODE: ALG NAME: SOUTHERN ALTAI                   THREE LETTER CODE: ALT NAME: AMHARIC                          THREE LETTER CODE: AMH TWO LETTER CODE: AM NAME: ENGLISH, OLD (CA.450-1100)       THREE LETTER CODE: ANG NAME: ANGIKA                           THREE LETTER CODE: ANP NAME: APACHE LANGUAGES                 THREE LETTER CODE: APA NAME: OFFICIAL ARAMAIC (700-300 BCE)   THREE LETTER CODE: ARC NAME: ARAGONESE                        THREE LETTER CODE: ARG TWO LETTER CODE: AN NAME: ARMENIAN                         THREE LETTER CODE: ARM TWO LETTER CODE: HY NAME: MAPUDUNGUN                       THREE LETTER CODE: ARN NAME: ARAPAHO                          THREE LETTER CODE: ARP NAME: ARTIFICIAL LANGUAGES             THREE LETTER CODE: ART NAME: ARAWAK                           THREE LETTER CODE: ARW NAME: ASSAMESE                         THREE LETTER CODE: ASM TWO LETTER CODE: AS NAME: ASTURIAN                         THREE LETTER CODE: AST NAME: ATHAPASCAN LANGUAGES             THREE LETTER CODE: ATH NAME: AUSTRALIAN LANGUAGES             THREE LETTER CODE: AUS NAME: AVARIC                           THREE LETTER CODE: AVA TWO LETTER CODE: AV NAME: AVESTAN                          THREE LETTER CODE: AVE TWO LETTER CODE: AE NAME: AWADHI                           THREE LETTER CODE: AWA NAME: AYMARA                           THREE LETTER CODE: AYM TWO LETTER CODE: AY NAME: AZERBAIJANI                      THREE LETTER CODE: AZE TWO LETTER CODE: AZ NAME: BANDA LANGUAGES                  THREE LETTER CODE: BAD NAME: BAMILEKE LANGUAGES               THREE LETTER CODE: BAI NAME: BASHKIR                          THREE LETTER CODE: BAK TWO LETTER CODE: BA NAME: BALUCHI                          THREE LETTER CODE: BAL NAME: BAMBARA                          THREE LETTER CODE: BAM TWO LETTER CODE: BM NAME: BALINESE                         THREE LETTER CODE: BAN NAME: BASQUE                           THREE LETTER CODE: BAQ TWO LETTER CODE: EU NAME: BASA                             THREE LETTER CODE: BAS NAME: BALTIC LANGUAGES                 THREE LETTER CODE: BAT NAME: BEJA                             THREE LETTER CODE: BEJ NAME: BELARUSIAN                       THREE LETTER CODE: BEL TWO LETTER CODE: BE NAME: BEMBA                            THREE LETTER CODE: BEM NAME: BENGALI                          THREE LETTER CODE: BEN TWO LETTER CODE: BN NAME: BERBER LANGUAGES)                THREE LETTER CODE: BER NAME: BHOJPURI                          THREE LETTER CODE: BHO NAME: BIHARI LANGUAGES                  THREE LETTER CODE: BIH   TWO LETTER CODE: BH NAME: BIKOL                             THREE LETTER CODE: BIK NAME: BINI                              THREE LETTER CODE: BIN NAME: BISLAMA                           THREE LETTER CODE: BIS   TWO LETTER CODE: BI NAME: SIKSIKA                           THREE LETTER CODE: BLA NAME: BANTU LANGUAGES                   THREE LETTER CODE: BNT NAME: BOSNIAN                           THREE LETTER CODE: BOS   TWO LETTER CODE: BS NAME: BRAJ                              THREE LETTER CODE: BRA NAME: BRETON                            THREE LETTER CODE: BRE   TWO LETTER CODE: BR NAME: BATAK LANGUAGES                   THREE LETTER CODE: BTK NAME: BURIAT                            THREE LETTER CODE: BUA NAME: BUGINESE                         THREE LETTER CODE: BUG NAME: BULGARIAN                        THREE LETTER CODE: BUL TWO LETTER CODE: BG NAME: BURMESE                          THREE LETTER CODE: BUR TWO LETTER CODE: MY NAME: BLIN                             THREE LETTER CODE: BYN NAME: CADDO                            THREE LETTER CODE: CAD NAME: CENTRAL AMERICAN INDIAN LANGUAGES THREE LETTER CODE: CAI NAME: GALIBI CARIB                     THREE LETTER CODE: CAR NAME: CATALAN                          THREE LETTER CODE: CAT TWO LETTER CODE: CA NAME: CAUCASIAN LANGUAGES              THREE LETTER CODE: CAU NAME: CEBUANO                          THREE LETTER CODE: CEB NAME: CELTIC LANGUAGES                 THREE LETTER CODE: CEL NAME: CHAMORRO                         THREE LETTER CODE: CHA TWO LETTER CODE: CH NAME: CHIBCHA                          THREE LETTER CODE: CHB NAME: CHECHEN                          THREE LETTER CODE: CHE TWO LETTER CODE: CE NAME: CHAGATAI                         THREE LETTER CODE: CHG NAME: CHINESE                          THREE LETTER CODE: CHI TWO LETTER CODE: ZH NAME: CHUUKESE                         THREE LETTER CODE: CHK NAME: MARI                             THREE LETTER CODE: CHM NAME: CHINOOK JARGON                   THREE LETTER CODE: CHN NAME: CHOCTAW                          THREE LETTER CODE: CHO NAME: CHIPEWYAN                        THREE LETTER CODE: CHP NAME: CHEROKEE                         THREE LETTER CODE: CHR NAME: CHURCH SLAVIC                    THREE LETTER CODE: CHU TWO LETTER CODE: CU NAME: CHUVASH                          THREE LETTER CODE: CHV TWO LETTER CODE: CV NAME: CHEYENNE                         THREE LETTER CODE: CHY NAME: CHAMIC LANGUAGES                 THREE LETTER CODE: CMC NAME: COPTIC                           THREE LETTER CODE: COP NAME: CORNISH                          THREE LETTER CODE: COR TWO LETTER CODE: KW NAME: CORSICAN                         THREE LETTER CODE: COS TWO LETTER CODE: CO NAME: CREOLES AND PIDGINS, ENGLISH BASED THREE LETTER CODE: CPE NAME: CREOLES AND PIDGINS, FRENCH-BASED THREE LETTER CODE: CPF NAME: CREOLES AND PIDGINS, PORTUGUESE-BASED THREE LETTER CODE: CPP NAME: CREE                             THREE LETTER CODE: CRE TWO LETTER CODE: CR NAME: CRIMEAN TATAR                    THREE LETTER CODE: CRH NAME: CREOLES AND PIDGINS              THREE LETTER CODE: CRP NAME: KASHUBIAN                        THREE LETTER CODE: CSB NAME: CUSHITIC LANGUAGES               THREE LETTER CODE: CUS NAME: CZECH                            THREE LETTER CODE: CZE TWO LETTER CODE: CS NAME: DAKOTA                           THREE LETTER CODE: DAK NAME: DANISH                           THREE LETTER CODE: DAN TWO LETTER CODE: DA NAME: DARGWA                           THREE LETTER CODE: DAR NAME: LAND DAYAK LANGUAGES             THREE LETTER CODE: DAY NAME: DELAWARE                         THREE LETTER CODE: DEL NAME: SLAVE (ATHAPASCAN)               THREE LETTER CODE: DEN NAME: DOGRIB                           THREE LETTER CODE: DGR NAME: DINKA                            THREE LETTER CODE: DIN NAME: DIVEHI                           THREE LETTER CODE: DIV TWO LETTER CODE: DV NAME: DOGRI                            THREE LETTER CODE: DOI NAME: DRAVIDIAN LANGUAGES              THREE LETTER CODE: DRA NAME: LOWER SORBIAN                    THREE LETTER CODE: DSB NAME: DUALA                            THREE LETTER CODE: DUA NAME: DUTCH, MIDDLE (CA.1050-1350)     THREE LETTER CODE: DUM NAME: DUTCH                            THREE LETTER CODE: DUT TWO LETTER CODE: NL NAME: DYULA                            THREE LETTER CODE: DYU NAME: DZONGKHA                         THREE LETTER CODE: DZO TWO LETTER CODE: DZ NAME: EFIK                             THREE LETTER CODE: EFI NAME: EGYPTIAN (ANCIENT)               THREE LETTER CODE: EGY NAME: EKAJUK                           THREE LETTER CODE: EKA NAME: ELAMITE                          THREE LETTER CODE: ELX NAME: ENGLISH, MIDDLE (1100-1500)      THREE LETTER CODE: ENM NAME: ESPERANTO                        THREE LETTER CODE: EPO TWO LETTER CODE: EO NAME: ESTONIAN                         THREE LETTER CODE: EST TWO LETTER CODE: ET NAME: EWE                              THREE LETTER CODE: EWE TWO LETTER CODE: EE NAME: EWONDO                           THREE LETTER CODE: EWO NAME: FANG                             THREE LETTER CODE: FAN NAME: FAROESE                          THREE LETTER CODE: FAO TWO LETTER CODE: FO NAME: FANTI                            THREE LETTER CODE: FAT NAME: FIJIAN                           THREE LETTER CODE: FIJ TWO LETTER CODE: FJ NAME: FILIPINO                         THREE LETTER CODE: FIL NAME: FINNO-UGRIAN LANGUAGES)          THREE LETTER CODE: FIU NAME: FON                               THREE LETTER CODE: FON NAME: FRENCH, MIDDLE (CA.1400-1600)     THREE LETTER CODE: FRM NAME: FRENCH, OLD (842-CA.1400)         THREE LETTER CODE: FRO NAME: NORTHERN FRISIAN                  THREE LETTER CODE: FRR NAME: EASTERN FRISIAN                   THREE LETTER CODE: FRS NAME: WESTERN FRISIAN                   THREE LETTER CODE: FRY   TWO LETTER CODE: FY NAME: FULAH                             THREE LETTER CODE: FUL   TWO LETTER CODE: FF NAME: FRIULIAN                          THREE LETTER CODE: FUR NAME: GA                                THREE LETTER CODE: GAA NAME: GAYO                              THREE LETTER CODE: GAY NAME: GBAYA                             THREE LETTER CODE: GBA NAME: GERMANIC LANGUAGES                THREE LETTER CODE: GEM NAME: GEORGIAN                          THREE LETTER CODE: GEO TWO LETTER CODE: KA NAME: GEEZ                             THREE LETTER CODE: GEZ NAME: GILBERTESE                       THREE LETTER CODE: GIL NAME: GAELIC                           THREE LETTER CODE: GLA TWO LETTER CODE: GD NAME: IRISH                            THREE LETTER CODE: GLE TWO LETTER CODE: GA NAME: GALICIAN                         THREE LETTER CODE: GLG TWO LETTER CODE: GL NAME: MANX                             THREE LETTER CODE: GLV TWO LETTER CODE: GV NAME: GERMAN, MIDDLE HIGH (CA.1050-1500) THREE LETTER CODE: GMH NAME: GERMAN, OLD HIGH (CA.750-1050)   THREE LETTER CODE: GOH NAME: GONDI                            THREE LETTER CODE: GON NAME: GORONTALO                        THREE LETTER CODE: GOR NAME: GOTHIC                           THREE LETTER CODE: GOT NAME: GREBO                            THREE LETTER CODE: GRB NAME: GREEK, ANCIENT (TO 1453)         THREE LETTER CODE: GRC NAME: GREEK, MODERN (1453-)            THREE LETTER CODE: GRE TWO LETTER CODE: EL NAME: GUARANI                          THREE LETTER CODE: GRN TWO LETTER CODE: GN NAME: SWISS GERMAN                     THREE LETTER CODE: GSW NAME: GUJARATI                         THREE LETTER CODE: GUJ TWO LETTER CODE: GU NAME: GWICH'IN                         THREE LETTER CODE: GWI NAME: HAIDA                            THREE LETTER CODE: HAI NAME: HAITIAN                          THREE LETTER CODE: HAT TWO LETTER CODE: HT NAME: HAUSA                            THREE LETTER CODE: HAU TWO LETTER CODE: HA NAME: HAWAIIAN                         THREE LETTER CODE: HAW NAME: HERERO                           THREE LETTER CODE: HER TWO LETTER CODE: HZ NAME: HILIGAYNON                       THREE LETTER CODE: HIL NAME: HIMACHALI LANGUAGES              THREE LETTER CODE: HIM NAME: HINDI                            THREE LETTER CODE: HIN TWO LETTER CODE: HI NAME: HITTITE                          THREE LETTER CODE: HIT NAME: HMONG                            THREE LETTER CODE: HMN NAME: HIRI MOTU                        THREE LETTER CODE: HMO TWO LETTER CODE: HO NAME: CROATIAN                         THREE LETTER CODE: HRV TWO LETTER CODE: HR NAME: UPPER SORBIAN                    THREE LETTER CODE: HSB NAME: HUNGARIAN                        THREE LETTER CODE: HUN TWO LETTER CODE: HU NAME: HUPA                             THREE LETTER CODE: HUP NAME: IBAN                             THREE LETTER CODE: IBA NAME: IGBO                             THREE LETTER CODE: IBO TWO LETTER CODE: IG NAME: ICELANDIC                        THREE LETTER CODE: ICE TWO LETTER CODE: IS NAME: IDO                              THREE LETTER CODE: IDO TWO LETTER CODE: IO NAME: SICHUAN YI                       THREE LETTER CODE: III TWO LETTER CODE: II NAME: IJO LANGUAGES                    THREE LETTER CODE: IJO NAME: INUKTITUT                        THREE LETTER CODE: IKU TWO LETTER CODE: IU NAME: INTERLINGUE                      THREE LETTER CODE: ILE TWO LETTER CODE: IE NAME: ILOKO                            THREE LETTER CODE: ILO NAME: INTERLINGUA (INTERNATIONAL AUXILIARY LANGUAGE ASSOCIATION) THREE LETTER CODE: INA               TWO LETTER CODE: IA NAME: INDIC LANGUAGES                   THREE LETTER CODE: INC NAME: INDONESIAN                       THREE LETTER CODE: IND TWO LETTER CODE: ID NAME: INDO-EUROPEAN LANGUAGES          THREE LETTER CODE: INE NAME: INGUSH                           THREE LETTER CODE: INH NAME: INUPIAQ                          THREE LETTER CODE: IPK TWO LETTER CODE: IK NAME: IRANIAN LANGUAGES                THREE LETTER CODE: IRA NAME: IROQUOIAN LANGUAGES              THREE LETTER CODE: IRO NAME: JAVANESE                         THREE LETTER CODE: JAV TWO LETTER CODE: JV NAME: LOJBAN                           THREE LETTER CODE: JBO NAME: JAPANESE                         THREE LETTER CODE: JPN TWO LETTER CODE: JA NAME: JUDEO-PERSIAN                    THREE LETTER CODE: JPR NAME: JUDEO-ARABIC                     THREE LETTER CODE: JRB NAME: KARA-KALPAK                      THREE LETTER CODE: KAA NAME: KABYLE                           THREE LETTER CODE: KAB NAME: KACHIN                           THREE LETTER CODE: KAC NAME: KALAALLISUT                      THREE LETTER CODE: KAL TWO LETTER CODE: KL NAME: KAMBA                            THREE LETTER CODE: KAM NAME: KANNADA                          THREE LETTER CODE: KAN TWO LETTER CODE: KN NAME: KAREN LANGUAGES                  THREE LETTER CODE: KAR NAME: KASHMIRI                         THREE LETTER CODE: KAS TWO LETTER CODE: KS NAME: KANURI                           THREE LETTER CODE: KAU TWO LETTER CODE: KR NAME: KAWI                             THREE LETTER CODE: KAW NAME: KAZAKH                           THREE LETTER CODE: KAZ TWO LETTER CODE: KK NAME: KABARDIAN                        THREE LETTER CODE: KBD NAME: KHASI                            THREE LETTER CODE: KHA NAME: KHOISAN LANGUAGES                THREE LETTER CODE: KHI NAME: CENTRAL KHMER                    THREE LETTER CODE: KHM TWO LETTER CODE: KM NAME: KHOTANESE                        THREE LETTER CODE: KHO NAME: KIKUYU                           THREE LETTER CODE: KIK TWO LETTER CODE: KI NAME: KINYARWANDA                      THREE LETTER CODE: KIN TWO LETTER CODE: RW NAME: KIRGHIZ                          THREE LETTER CODE: KIR TWO LETTER CODE: KY NAME: KIMBUNDU                         THREE LETTER CODE: KMB NAME: KONKANI                          THREE LETTER CODE: KOK NAME: KOMI                             THREE LETTER CODE: KOM TWO LETTER CODE: KV NAME: KONGO                            THREE LETTER CODE: KON TWO LETTER CODE: KG NAME: KOREAN                           THREE LETTER CODE: KOR TWO LETTER CODE: KO NAME: KOSRAEAN                         THREE LETTER CODE: KOS NAME: KPELLE                           THREE LETTER CODE: KPE NAME: KARACHAY-BALKAR                  THREE LETTER CODE: KRC NAME: KARELIAN                         THREE LETTER CODE: KRL NAME: KRU LANGUAGES                    THREE LETTER CODE: KRO NAME: KURUKH                           THREE LETTER CODE: KRU NAME: KUANYAMA                         THREE LETTER CODE: KUA TWO LETTER CODE: KJ NAME: KUMYK                            THREE LETTER CODE: KUM NAME: KURDISH                          THREE LETTER CODE: KUR TWO LETTER CODE: KU NAME: KUTENAI                          THREE LETTER CODE: KUT NAME: LADINO                           THREE LETTER CODE: LAD NAME: LAHNDA                           THREE LETTER CODE: LAH NAME: LAMBA                            THREE LETTER CODE: LAM NAME: LAO                              THREE LETTER CODE: LAO TWO LETTER CODE: LO NAME: LATIN                            THREE LETTER CODE: LAT TWO LETTER CODE: LA NAME: LATVIAN                          THREE LETTER CODE: LAV TWO LETTER CODE: LV NAME: LEZGHIAN                         THREE LETTER CODE: LEZ NAME: LIMBURGAN                        THREE LETTER CODE: LIM TWO LETTER CODE: LI NAME: LINGALA                          THREE LETTER CODE: LIN TWO LETTER CODE: LN NAME: LITHUANIAN                       THREE LETTER CODE: LIT TWO LETTER CODE: LT NAME: MONGO                            THREE LETTER CODE: LOL NAME: LOZI                             THREE LETTER CODE: LOZ NAME: LUXEMBOURGISH                    THREE LETTER CODE: LTZ TWO LETTER CODE: LB NAME: LUBA-LULUA                       THREE LETTER CODE: LUA NAME: LUBA-KATANGA                     THREE LETTER CODE: LUB TWO LETTER CODE: LU NAME: GANDA                            THREE LETTER CODE: LUG TWO LETTER CODE: LG NAME: LUISENO                          THREE LETTER CODE: LUI NAME: LUNDA                            THREE LETTER CODE: LUN NAME: LUO (KENYA AND TANZANIA)         THREE LETTER CODE: LUO NAME: LUSHAI                           THREE LETTER CODE: LUS NAME: MACEDONIAN                       THREE LETTER CODE: MAC TWO LETTER CODE: MK NAME: MADURESE                         THREE LETTER CODE: MAD NAME: MAGAHI                           THREE LETTER CODE: MAG NAME: MARSHALLESE                      THREE LETTER CODE: MAH TWO LETTER CODE: MH NAME: MAITHILI                         THREE LETTER CODE: MAI NAME: MAKASAR                          THREE LETTER CODE: MAK NAME: MALAYALAM                        THREE LETTER CODE: MAL TWO LETTER CODE: ML NAME: MANDINGO                         THREE LETTER CODE: MAN NAME: MAORI                            THREE LETTER CODE: MAO TWO LETTER CODE: MI NAME: AUSTRONESIAN LANGUAGES           THREE LETTER CODE: MAP NAME: MARATHI                          THREE LETTER CODE: MAR TWO LETTER CODE: MR NAME: MASAI                            THREE LETTER CODE: MAS NAME: MALAY                            THREE LETTER CODE: MAY TWO LETTER CODE: MS NAME: MOKSHA                           THREE LETTER CODE: MDF NAME: MANDAR                           THREE LETTER CODE: MDR NAME: MENDE                            THREE LETTER CODE: MEN NAME: IRISH, MIDDLE (900-1200)         THREE LETTER CODE: MGA NAME: MI'KMAQ                          THREE LETTER CODE: MIC NAME: MINANGKABAU                      THREE LETTER CODE: MIN NAME: UNCODED LANGUAGES                THREE LETTER CODE: MIS NAME: MON-KHMER LANGUAGES              THREE LETTER CODE: MKH NAME: MALAGASY                         THREE LETTER CODE: MLG TWO LETTER CODE: MG NAME: MALTESE                          THREE LETTER CODE: MLT TWO LETTER CODE: MT NAME: MANCHU                           THREE LETTER CODE: MNC NAME: MANIPURI                         THREE LETTER CODE: MNI NAME: MANOBO LANGUAGES                 THREE LETTER CODE: MNO NAME: MOHAWK                           THREE LETTER CODE: MOH NAME: MONGOLIAN                        THREE LETTER CODE: MON TWO LETTER CODE: MN NAME: MOSSI                            THREE LETTER CODE: MOS NAME: MULTIPLE LANGUAGES               THREE LETTER CODE: MUL NAME: MUNDA LANGUAGES                  THREE LETTER CODE: MUN NAME: CREEK                            THREE LETTER CODE: MUS NAME: MIRANDESE                        THREE LETTER CODE: MWL NAME: MARWARI                          THREE LETTER CODE: MWR NAME: MAYAN LANGUAGES                  THREE LETTER CODE: MYN NAME: ERZYA                            THREE LETTER CODE: MYV NAME: NAHUATL LANGUAGES                THREE LETTER CODE: NAH NAME: NORTH AMERICAN INDIAN LANGUAGES  THREE LETTER CODE: NAI NAME: NEAPOLITAN                       THREE LETTER CODE: NAP NAME: NAURU                            THREE LETTER CODE: NAU TWO LETTER CODE: NA NAME: NAVAJO                           THREE LETTER CODE: NAV TWO LETTER CODE: NV NAME: NDEBELE, SOUTH                   THREE LETTER CODE: NBL TWO LETTER CODE: NR NAME: NDEBELE, NORTH                   THREE LETTER CODE: NDE TWO LETTER CODE: ND NAME: NDONGA                           THREE LETTER CODE: NDO TWO LETTER CODE: NG NAME: LOW GERMAN                       THREE LETTER CODE: NDS NAME: NEPALI                           THREE LETTER CODE: NEP TWO LETTER CODE: NE NAME: NEPAL BHASA                      THREE LETTER CODE: NEW NAME: NIAS                             THREE LETTER CODE: NIA NAME: NIGER-KORDOFANIAN LANGUAGES      THREE LETTER CODE: NIC NAME: NIUEAN                           THREE LETTER CODE: NIU NAME: NORWEGIAN NYNORSK                THREE LETTER CODE: NNO TWO LETTER CODE: NN NAME: BOKMåL, NORWEGIAN               THREE LETTER CODE: NOB TWO LETTER CODE: NB NAME: NOGAI                            THREE LETTER CODE: NOG NAME: NORSE, OLD                       THREE LETTER CODE: NON NAME: NORWEGIAN                        THREE LETTER CODE: NOR TWO LETTER CODE: NO NAME: N'KO                             THREE LETTER CODE: NQO NAME: PEDI                             THREE LETTER CODE: NSO NAME: NUBIAN LANGUAGES                 THREE LETTER CODE: NUB NAME: CLASSICAL NEWARI                 THREE LETTER CODE: NWC NAME: CHICHEWA                         THREE LETTER CODE: NYA TWO LETTER CODE: NY NAME: NYAMWEZI                         THREE LETTER CODE: NYM NAME: NYANKOLE                         THREE LETTER CODE: NYN NAME: NYORO                            THREE LETTER CODE: NYO NAME: NZIMA                            THREE LETTER CODE: NZI NAME: OCCITAN (POST 1500)              THREE LETTER CODE: OCI TWO LETTER CODE: OC NAME: OJIBWA                           THREE LETTER CODE: OJI TWO LETTER CODE: OJ NAME: ORIYA                            THREE LETTER CODE: ORI TWO LETTER CODE: OR NAME: OROMO                            THREE LETTER CODE: ORM TWO LETTER CODE: OM NAME: OSAGE                            THREE LETTER CODE: OSA NAME: OSSETIAN                         THREE LETTER CODE: OSS TWO LETTER CODE: OS NAME: TURKISH, OTTOMAN (1500-1928)     THREE LETTER CODE: OTA NAME: OTOMIAN LANGUAGES                THREE LETTER CODE: OTO NAME: PAPUAN LANGUAGES                 THREE LETTER CODE: PAA NAME: PANGASINAN                       THREE LETTER CODE: PAG NAME: PAHLAVI                          THREE LETTER CODE: PAL NAME: PAMPANGA                         THREE LETTER CODE: PAM NAME: PANJABI                          THREE LETTER CODE: PAN TWO LETTER CODE: PA NAME: PAPIAMENTO                       THREE LETTER CODE: PAP NAME: PALAUAN                          THREE LETTER CODE: PAU NAME: PERSIAN, OLD (CA.600-400 B.C.)   THREE LETTER CODE: PEO NAME: PERSIAN                          THREE LETTER CODE: PER TWO LETTER CODE: FA NAME: PHILIPPINE LANGUAGES)            THREE LETTER CODE: PHI NAME: PHOENICIAN                        THREE LETTER CODE: PHN NAME: PALI                              THREE LETTER CODE: PLI   TWO LETTER CODE: PI NAME: POLISH                            THREE LETTER CODE: POL   TWO LETTER CODE: PL NAME: POHNPEIAN                         THREE LETTER CODE: PON NAME: PRAKRIT LANGUAGES                 THREE LETTER CODE: PRA NAME: PROVENçAL, OLD (TO 1500)         THREE LETTER CODE: PRO NAME: PUSHTO                            THREE LETTER CODE: PUS   TWO LETTER CODE: PS NAME: RESERVED FOR LOCAL USE (QAA-QTZ)  THREE LETTER CODE: QAA NAME: QUECHUA                           THREE LETTER CODE: QUE   TWO LETTER CODE: QU NAME: RAJASTHANI                        THREE LETTER CODE: RAJ NAME: RAPANUI                           THREE LETTER CODE: RAP NAME: RAROTONGAN                        THREE LETTER CODE: RAR NAME: ROMANCE LANGUAGES                THREE LETTER CODE: ROA NAME: ROMANSH                          THREE LETTER CODE: ROH TWO LETTER CODE: RM NAME: ROMANY                           THREE LETTER CODE: ROM NAME: ROMANIAN                         THREE LETTER CODE: RUM TWO LETTER CODE: RO NAME: RUNDI                            THREE LETTER CODE: RUN TWO LETTER CODE: RN NAME: AROMANIAN                        THREE LETTER CODE: RUP NAME: SANDAWE                          THREE LETTER CODE: SAD NAME: SANGO                            THREE LETTER CODE: SAG TWO LETTER CODE: SG NAME: YAKUT                            THREE LETTER CODE: SAH NAME: SOUTH AMERICAN INDIAN LANGUAGES  THREE LETTER CODE: SAI NAME: SALISHAN LANGUAGES               THREE LETTER CODE: SAL NAME: SAMARITAN ARAMAIC                THREE LETTER CODE: SAM NAME: SANSKRIT                         THREE LETTER CODE: SAN TWO LETTER CODE: SA NAME: SASAK                            THREE LETTER CODE: SAS NAME: SANTALI                          THREE LETTER CODE: SAT NAME: SICILIAN                         THREE LETTER CODE: SCN NAME: SCOTS                            THREE LETTER CODE: SCO NAME: SELKUP                           THREE LETTER CODE: SEL NAME: SEMITIC LANGUAGES                THREE LETTER CODE: SEM NAME: IRISH, OLD (TO 900)              THREE LETTER CODE: SGA NAME: SIGN LANGUAGES                   THREE LETTER CODE: SGN NAME: SHAN                             THREE LETTER CODE: SHN NAME: SIDAMO                           THREE LETTER CODE: SID NAME: SINHALA                          THREE LETTER CODE: SIN TWO LETTER CODE: SI NAME: SIOUAN LANGUAGES                 THREE LETTER CODE: SIO NAME: SINO-TIBETAN LANGUAGES           THREE LETTER CODE: SIT NAME: SLAVIC LANGUAGES                 THREE LETTER CODE: SLA NAME: SLOVAK                           THREE LETTER CODE: SLO TWO LETTER CODE: SK NAME: SLOVENIAN                        THREE LETTER CODE: SLV TWO LETTER CODE: SL NAME: SOUTHERN SAMI                    THREE LETTER CODE: SMA NAME: NORTHERN SAMI                    THREE LETTER CODE: SME TWO LETTER CODE: SE NAME: SAMI LANGUAGES                   THREE LETTER CODE: SMI NAME: LULE SAMI                        THREE LETTER CODE: SMJ NAME: INARI SAMI                       THREE LETTER CODE: SMN NAME: SAMOAN                           THREE LETTER CODE: SMO TWO LETTER CODE: SM NAME: SKOLT SAMI                       THREE LETTER CODE: SMS NAME: SHONA                            THREE LETTER CODE: SNA TWO LETTER CODE: SN NAME: SINDHI                           THREE LETTER CODE: SND TWO LETTER CODE: SD NAME: SONINKE                          THREE LETTER CODE: SNK NAME: SOGDIAN                          THREE LETTER CODE: SOG NAME: SOMALI                           THREE LETTER CODE: SOM TWO LETTER CODE: SO NAME: SONGHAI LANGUAGES                THREE LETTER CODE: SON NAME: SOTHO, SOUTHERN                  THREE LETTER CODE: SOT TWO LETTER CODE: ST NAME: SARDINIAN                        THREE LETTER CODE: SRD TWO LETTER CODE: SC NAME: SRANAN TONGO                     THREE LETTER CODE: SRN NAME: SERBIAN                          THREE LETTER CODE: SRP TWO LETTER CODE: SR NAME: SERER                            THREE LETTER CODE: SRR NAME: NILO-SAHARAN LANGUAGES           THREE LETTER CODE: SSA NAME: SWATI                            THREE LETTER CODE: SSW TWO LETTER CODE: SS NAME: SUKUMA                           THREE LETTER CODE: SUK NAME: SUNDANESE                        THREE LETTER CODE: SUN TWO LETTER CODE: SU NAME: SUSU                             THREE LETTER CODE: SUS NAME: SUMERIAN                         THREE LETTER CODE: SUX NAME: SWAHILI                          THREE LETTER CODE: SWA TWO LETTER CODE: SW NAME: SWEDISH                          THREE LETTER CODE: SWE TWO LETTER CODE: SV NAME: CLASSICAL SYRIAC                 THREE LETTER CODE: SYC NAME: SYRIAC                           THREE LETTER CODE: SYR NAME: TAHITIAN                         THREE LETTER CODE: TAH TWO LETTER CODE: TY NAME: TAI LANGUAGES                    THREE LETTER CODE: TAI NAME: TAMIL                            THREE LETTER CODE: TAM TWO LETTER CODE: TA NAME: TATAR                            THREE LETTER CODE: TAT TWO LETTER CODE: TT NAME: TELUGU                           THREE LETTER CODE: TEL TWO LETTER CODE: TE NAME: TIMNE                            THREE LETTER CODE: TEM NAME: TERENO                           THREE LETTER CODE: TER NAME: TETUM                            THREE LETTER CODE: TET NAME: TAJIK                            THREE LETTER CODE: TGK TWO LETTER CODE: TG NAME: TAGALOG                          THREE LETTER CODE: TGL TWO LETTER CODE: TL NAME: THAI                             THREE LETTER CODE: THA TWO LETTER CODE: TH NAME: TIBETAN                          THREE LETTER CODE: TIB TWO LETTER CODE: BO NAME: TIGRE                            THREE LETTER CODE: TIG NAME: TIGRINYA                         THREE LETTER CODE: TIR TWO LETTER CODE: TI NAME: TIV                              THREE LETTER CODE: TIV NAME: TOKELAU                          THREE LETTER CODE: TKL NAME: KLINGON                          THREE LETTER CODE: TLH NAME: TLINGIT                          THREE LETTER CODE: TLI NAME: TAMASHEK                         THREE LETTER CODE: TMH NAME: TONGA (NYASA)                    THREE LETTER CODE: TOG NAME: TONGA (TONGA ISLANDS)            THREE LETTER CODE: TON TWO LETTER CODE: TO NAME: TOK PISIN                        THREE LETTER CODE: TPI NAME: TSIMSHIAN                        THREE LETTER CODE: TSI NAME: TSWANA                           THREE LETTER CODE: TSN TWO LETTER CODE: TN NAME: TSONGA                           THREE LETTER CODE: TSO TWO LETTER CODE: TS NAME: TURKMEN                          THREE LETTER CODE: TUK TWO LETTER CODE: TK NAME: TUMBUKA                          THREE LETTER CODE: TUM NAME: TUPI LANGUAGES                   THREE LETTER CODE: TUP NAME: TURKISH                          THREE LETTER CODE: TUR TWO LETTER CODE: TR NAME: ALTAIC LANGUAGES                 THREE LETTER CODE: TUT NAME: TUVALU                           THREE LETTER CODE: TVL NAME: TWI                              THREE LETTER CODE: TWI TWO LETTER CODE: TW NAME: TUVINIAN                         THREE LETTER CODE: TYV NAME: UDMURT                           THREE LETTER CODE: UDM NAME: UGARITIC                         THREE LETTER CODE: UGA NAME: UIGHUR                           THREE LETTER CODE: UIG TWO LETTER CODE: UG NAME: UKRAINIAN                        THREE LETTER CODE: UKR TWO LETTER CODE: UK NAME: UMBUNDU                          THREE LETTER CODE: UMB NAME: UNDETERMINED                     THREE LETTER CODE: UND NAME: URDU                             THREE LETTER CODE: URD TWO LETTER CODE: UR NAME: UZBEK                            THREE LETTER CODE: UZB TWO LETTER CODE: UZ NAME: VAI                              THREE LETTER CODE: VAI NAME: VENDA                            THREE LETTER CODE: VEN TWO LETTER CODE: VE NAME: VIETNAMESE                       THREE LETTER CODE: VIE TWO LETTER CODE: VI NAME: VOLAPüK                         THREE LETTER CODE: VOL TWO LETTER CODE: VO NAME: VOTIC                            THREE LETTER CODE: VOT NAME: WAKASHAN LANGUAGES               THREE LETTER CODE: WAK NAME: WOLAITTA                         THREE LETTER CODE: WAL NAME: WARAY                            THREE LETTER CODE: WAR NAME: WASHO                            THREE LETTER CODE: WAS NAME: WELSH                            THREE LETTER CODE: WEL TWO LETTER CODE: CY NAME: SORBIAN LANGUAGES                THREE LETTER CODE: WEN NAME: WALLOON                          THREE LETTER CODE: WLN TWO LETTER CODE: WA NAME: WOLOF                            THREE LETTER CODE: WOL TWO LETTER CODE: WO NAME: KALMYK                           THREE LETTER CODE: XAL NAME: XHOSA                            THREE LETTER CODE: XHO TWO LETTER CODE: XH NAME: YAO                              THREE LETTER CODE: YAO NAME: YAPESE                           THREE LETTER CODE: YAP NAME: YIDDISH                          THREE LETTER CODE: YID TWO LETTER CODE: YI NAME: YORUBA                           THREE LETTER CODE: YOR TWO LETTER CODE: YO NAME: YUPIK LANGUAGES                  THREE LETTER CODE: YPK NAME: ZAPOTEC                          THREE LETTER CODE: ZAP NAME: BLISSYMBOLS                      THREE LETTER CODE: ZBL NAME: ZENAGA                           THREE LETTER CODE: ZEN NAME: ZHUANG                           THREE LETTER CODE: ZHA TWO LETTER CODE: ZA NAME: ZANDE LANGUAGES                  THREE LETTER CODE: ZND NAME: ZULU                             THREE LETTER CODE: ZUL TWO LETTER CODE: ZU NAME: ZUNI                             THREE LETTER CODE: ZUN NAME: NO LINGUISTIC CONTENT            THREE LETTER CODE: ZXX NAME: ZAZA                             THREE LETTER CODE: ZZA

Language File: Code Fields
Extending the Language file to store two- or three-character codes has gone through several drafts.

George Timson developed the first code field for the Language file for Medsphere OpenVistA. This field is part of the current draft of MSC Fileman:

.85,21400    CODE                   MSCISO;1 FREE TEXT INPUT TRANSFORM: K:X'?2L.E X              HELP-PROMPT:      This is the ISO code for the language. Max 9 bytes. Starts with two lower-case characters (e.g., 'en_US')

Instead of storing codes in the Language file, John McCormack developed a VW HL7 Tables file (260, described below) that can handle code-set versioning, then added a field to the Language file to point to this new file. This field is part of the current draft of WorldVistA EHR 2.0:

.85,250001   ISO LANGUAGE CODE      250000;1 POINTER TO VW HL7 TABLES FILE (#2                                60) INPUT TRANSFORM: S DIC("S")="I $P(^(0),U,3)=""HL70296""" D ^DIC K DIC S DIC=$G(DIE),X=+Y K:Y<0 X             LAST EDITED:      JUN 13, 2011 HELP-PROMPT:     Select the language code related to this language. DESCRIPTION:      Identifies the type of language being mapped to an ISO code. SCREEN:          S DIC("S")="I $P(^(0),U,3)=""HL70296""" EXPLANATION:     Only languages from HL7 table 0296 are selectab le.

Chris Richardson, recognizing that two fields would be needed to Record both two-character and three-character codes, and recognizing that these codes are useful identifiers for the Language file, added them as fields .03 and .04 on the 0 node. George Timson, concerned about collisions with future VA development on this file, convinced him to move them to name- and number-spaced fields on a separate node and with (semi-)namespaced cross-references:

.85,256000.01 VW 3 LETTER ABBREVIATION ABR;1 FREE TEXT INPUT TRANSFORM: K:$L(X)>3!($L(X)<3) X             LAST EDITED:      APR 12, 2011 HELP-PROMPT:     Answer must be 3 characters in length. DESCRIPTION:     This abbreviation is loaded from the ISO standard file for this purpose. CROSS-REFERENCE: .85^VW3 1)= S ^DI(.85,"VW3",$E(X,1,30),DA)=""                              2)= K ^DI(.85,"VW3",$E(X,1,30),DA) 3)= Regenerate Cross-Reference, Do not Delete                              This is a quick lookup for three letter                               abbreviations for languages.   .85,256000.02 VW 2 LETTER ABBREVIATION ABR;2 FREE TEXT             INPUT TRANSFORM:  K:$L(X)>2!($L(X)<2) X             LAST EDITED:      APR 12, 2011              HELP-Prompt:      Answer must be 2 characters in length.              DESCRIPTION:      This is derived from the ISO standards for                               abbreviations.               CROSS-REFERENCE:  .85^VW2                                1)= S ^DI(.85,"VW2",$E(X,1,30),DA)="" 2)= K ^DI(.85,"VW2",$E(X,1,30),DA)                              3)= Re-generate, do not delete. This is a sparser array than the 3 letter abbreviation.

VW HL7 Tables File
In parallel with the upgrade to the Language file, John McCormack created the VW HL7 Tables file (260) to Record codes from different codesets (including ISO 639) in a file that supported version control. Although this project is described in fuller detail on a separate Vistapedia page, a condensed version of the new file's DD is shown below for context:

CONDENSED DATA DICTIONARY---VW HL7 TABLES FILE (#260)UCI: DEV,VISTA  VERSION: 2.0 STORED IN: ^VWLEX(260,                                   01/22/12    PAGE 1                                    DD SECURITY    :       DELETE SECURITY:                                     READ SECURITY  :       LAYGO SECURITY :                                     WRITE SECURITY :            (NOTE: Kernel's File Access Security has been installed in this UCI.) CROSS REFERENCED BY:       TERM(B)  FILE #260 INDEXED BY:       CODE ID & CODE SYSTEM (AC), TABLE VERSION & CODE SYSTEM &                   CODE ID (AD), TABLE VERSION & CODE SYSTEM & CODE ID (AE),                   Application GROUP & APPLICATION USE (AG), TABLE & TERM STATUS                   (AH), TERM (C), NAME (D), NAME (E), TABLE (H)                                  FILE STRUCTURE FIELD     FIELD NUMBER    NAME .001      SEQUENCE (NJ7,0), [ ] .01       TERM (RFJ30), [0;1] .02       CODE TYPE (S), [0;2] .03      TABLE (FJ7), [0;3] .04      NAME (FJ100), [0;4] .05      TABLE OID (FJ64), [0;5] .06      TERM STATUS (S), [0;6] .07      REPLACEMENT TERM (*P260'), [0;7] .08      ENTRY STATUS (S), [0;8] .99      DESCRIPTION (Multiple-260.0099), [.99;0] .01 DESCRIPTION (W), [0;1] 1        VERSION (Multiple-260.001), [1;0] .01 TABLE VERSION (MFJ10), [0;1] .02 CODE ID (FJ15), [0;2] .03 CODE TEXT (FJ100), [0;3] .04 CODE SYSTEM (*P260'), [0;4] .05 CODE SYSTEM NAME (FJ20), [0;5] .06 CODE SYSTEM OID (FJ64), [0;6] .07 CODE STATUS (S), [0;7] .08 EFFECTIVE DATE (D), [0;8] .09 EXPIRATION DATE (D), [0;9] .1  CHECK DIGIT SCHEME (S), [0;10] .11 CODE SYSTEM VERSION (FJ20), [1;1] .12 STATUS DATE (D), [1;2] 2        Application GROUP (Multiple-260.002), [2;0] .01 Application GROUP (FJ4), [0;1] .02 Application USE (S), [0;2]

With this file created, Mr. McCormack considered the approach of doing away with the code fields in the Language file and instead using a simple pointer to file 260 to designate the code, on the reasonable theory that because code sets tend to be volatile and in need of versioning, they need to be stored in a file like 260 that supports versioning and should not also be redundantly stored elsewhere (such as in the Language file).

However, Rick Marshall argued that although that is generally true, it does not apply to the Language file for three reasons. First, Language names are often not unique in the first few characters (especially with cases like GREEK, ANCIENT versus GREEK, MODERN), so the file needs short codes that can be used as identifiers. Second, the versioning of the ISO 639 standards is cumulative rather than operating by replacement; the codes have to be stable from version to version because they are hard coded into all HTML documents on the World Wide Web. Third, and most importantly, as the foundation package of VISTA, File Manager cannot be dependent upon any other package (such as HL7, where file 260 will eventually go to live); putting a field that points to file 260 in file .85 would break the inter-package dependencies.

Therefore, Mr. McCormack agreed that WorldVistA would remove the ISO Language Code field from file .85. Instead file 260 would be extended to allow it to point to entities in other files that its codes describe. These two changes have not yet been made to the current draft of WorldVistA EHR 2.0.

Mr. McCormack also agreed WorldVistA EHR 2.0 will keep the two- and three-character code fields in file .85, though all versioning information about the codes as members of a codeset will indeed be stored in file 260; the two fields in file .85 will be treated merely as short identifiers, not as codes per se.

Listing of the new Language File
Condensed Listing CONDENSED DATA DICTIONARY---LANGUAGE FILE (#.85)UCI: EHR,EHR     VERSION: 22.2

STORED IN: ^DI(.85,                                      11/08/12    PAGE 1

FILE SECURITY DD SECURITY   : ^     DELETE SECURITY: ^ READ SECURITY :       LAYGO SECURITY : ^ WRITE SECURITY : ^ CROSS REFERENCED BY: ALTERNATE NAME(F)

FILE #.85 INDEXED BY:      NAME (B), TWO LETTER CODE (C), THREE LETTER CODE (D), ALTERNATE THREE LETTER CODE (E)

FILE STRUCTURE

FIELD    FIELD NUMBER   NAME

.001     ID NUMBER (NJ10,0), [ ] .01      NAME (RFJ60), [0;1] .02      TWO LETTER CODE (FJ2), [0;2] .03      THREE LETTER CODE (FJ3), [0;3] .04      FOUR LETTER CODE (FJ4), [0;4] .05      ALTERNATE THREE LETTER CODE (FJ3), [0;5] .06      SCOPE (S), [0;6] .07      TYPE (S), [0;7] .08      LINGUISTIC CATEGORY (*P.85'), [0;8] .09      MEMBER OF LANGUAGE SET (*P.85'), [0;9] 1        ALTERNATE NAME (Multiple-.8501), [1;0] .01 ALTERNATE NAME (MFJ60), [0;1] 10       DESCRIPTION (Multiple-.8502), [10;0] .01 DESCRIPTION (Wx), [0;1] 10.1     ORDINAL NUMBER FORMAT (K), [ORD;E1,245] 10.2     DATE/TIME FORMAT (K), [DD;E1,245] 10.21    DATE/TIME FORMAT (FMTE) (K), [FMTE;E1,245] 10.22    TIME (K), [TIME;E1,245] 10.3     CARDINAL NUMBER FORMAT (K), [CRD;E1,245] 10.4     UPPERCASE CONVERSION (K), [UC;E1,245] 10.5     LOWERCASE CONVERSION (K), [LC;E1,245] 20.2     DATE INPUT (K), [20.2;E1,245]

Indexes and Xrefs. INDEX AND CROSS-REFERENCE LIST -- FILE #.85                11/08/12    PAGE 1 ---

File #.85

New-Style Indexes:

B (#544)   FIELD    REGULAR    IR    LOOKUP & SORTING Unique for: Key A (#82), File #.85 Short Descr: Regular new-style B Index Set Logic: S ^DI(.85,"B",X,DA)="" Kill Logic: K ^DI(.85,"B",X,DA) Whole Kill: K ^DI(.85,"B") X(1): NAME  (.85,.01)  (Subscr 1)  (forwards)

C (#545)   FIELD    REGULAR    IR    LOOKUP & SORTING Short Descr: Regular new style index on two letter language codes Set Logic: S ^DI(.85,"C",X,DA)="" Kill Logic: K ^DI(.85,"C",X,DA) Whole Kill: K ^DI(.85,"C") X(1): TWO LETTER CODE  (.85,.02)  (Subscr 1)  (forwards)

D (#546)   FIELD    REGULAR    IR    LOOKUP & SORTING Unique for: Key B (#83), File #.85 Short Descr: Regular new-style index for three letter abbreviations for languages Set Logic: S ^DI(.85,"D",$E(X,1,30),DA)="" Kill Logic: K ^DI(.85,"D",$E(X,1,30),DA) Whole Kill: K ^DI(.85,"D") X(1): THREE LETTER CODE  (.85,.03)  (Subscr 1)  (Len 30) (forwards)

E (#547)   FIELD    MUMPS    IR    LOOKUP & SORTING Short Descr: (Pseudo-)Mneumonic index for the Alternate three letter code Description: This will add entries to the C index for the three letter code a la the mnemonic style. If you need re-cross-reference this field, you need to kill of the entries in the regular C index, set the C index, and then set this index to update the C with the mnemonic xrefs. Set Logic: S ^DI(.85,"D",X,DA)=1 Kill Logic: K ^DI(.85,"D",X,DA) X(1): ALTERNATE THREE LETTER CODE  (.85,.05)  (Subscr 1) (forwards)

Subfile #.8501

Traditional Cross-References:

B   REGULAR Field: ALTERNATE NAME  (.8501,.01) 1)= S ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)=""                   2)= K ^DI(.85,DA(1),1,"B",$E(X,1,30),DA)

F   REGULAR    WHOLE FILE (#.85) Field: ALTERNATE NAME  (.8501,.01) Description: Whole file cross-reference for ALTERNATE NAME multiple. 1)= S ^DI(.85,"F",$E(X,1,30),DA(1),DA)=""                   2)= K ^DI(.85,"F",$E(X,1,30),DA(1),DA) 3)= WHOLE FILE CROSS REFERENCE FOR ALTERNATE NAME

KEY LIST -- FILE #.85

FILE #.85 - PRIMARY KEY:        A (#82) Uniqueness Index: B (#544) File, Field: 1) NAME (.85,.01)

SECONDARY KEY:     B (#83) Uniqueness Index: D (#546) File, Field: 1) THREE LETTER CODE (.85,.03)

Sample Entry ID NUMBER: 2                           NAME: GERMAN TWO LETTER CODE: DE                  THREE LETTER CODE: DEU ALTERNATE THREE LETTER CODE: GER ALTERNATE NAME: GERMAN, STANDARD ALTERNATE NAME: STANDARD GERMAN ALTERNATE NAME: DEUTSCH ALTERNATE NAME: DEUTSCH SPRACHE ALTERNATE NAME: TEDESCO ALTERNATE NAME: MODERN GERMAN (1500-) ALTERNATE NAME: GERMAN,MODERN (1500-) CARDINAL NUMBER FORMAT: S:$G(Y) Y=$TR($FN(Y,","),",",".") DATE/TIME FORMAT: S:Y Y=$S($E(Y,6,7):$E(Y,6,7)_".",1:"")_$S($E(Y,4,5):$E(Y,4,5 )_".",1:"")_($E(Y,1,3)+1700)_$P(" "_$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,1 3,14):":"_$E(Y_0,13,14),1:""),"^",Y[".") LOWERCASE CONVERSION: S Y=$TR(Y,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]\","abcdefghijklm nopqrstuvwxyz{}|")                     ORDINAL NUMBER FORMAT: S:$G(Y) Y=Y_"." TIME: S Y=$S($L($G(Y),".")>1:$E(Y_0,9,10)_":"_$E(Y_"000",11,12)_$S($E(Y,13,14)
 * ":"_$E(Y_0,13,14),1:""),1:"")

UPPERCASE CONVERSION: S Y=$TR(Y,"abcdefghijklmnopqrstuvwxyz{}|","ABCDEFGHIJKLM NOPQRSTUVWXYZ[]\")

Distributing and Installing the Core Language File
When people refer to a Fileman file, they usually mean a file stored in the File Manager database management system (DBMS), but there a very different definition applies to the Language file. When a Fileman file is one of the files that Fileman himself uses to give him the ability to be a DBMS, when it's one of the files he uses to store all other files (like the File file), then the process of distributing and installing it is significantly more difficult, because he has to bootstrap himself without depending on any other package (including Kernel, the home of the Kernel Installation and Distribution System, or KIDS). This makes bundling up and distributing our changes a rare challenge of a kind that only members of the Fileman Development Team ever face.

Before the advent of KIDS with Kernel version 7 (May 1993), software was bundled and distributed not by Kernel but by Fileman. A developer who wanted to distribute a package would run the Fileman module ^DIFROM, answer questions about what they wanted to distribute, then DIFROM would generate a set of initialization routines that could be run at the destination sites to install the package. This is the general pattern of how we will distribute these Language file changes, except for one very important difference.

Because Fileman installing itself is a classic "boostrap yourself" situation, you cannot use DIFROM to create the DINIT routines (the initialization routines for Fileman's own files). The DINITs have to be hand-built to simulate what DIFROM would have created were it possible.

The project sketch for this task is: (1) to map out how the DINITs transport the existing Language file, (2) to plan out the changes to make to convert the DINITs to the new Language file, and (3) to modify the DINITs and test them thoroughly.

Mapping out How the DINITs Transport the Existing Language File
The following DINIT routines are involved in transporting the Language file:

DINIT    ;SFISC/GFT,XAK-INITIALIZE VA FILEMAN ;29MAY2006 DINIT3   ;SFISC/GFT-INITIALIZE VA FILEMAN ;28AUG2008 DINIT011 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;13JAN2011 DINIT012 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;2APR2004 DINIT013 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;9:34 AM  7 Aug 2002

DINIT and DINIT3 contain top-level control-flow logic for installing the Dialog and Language files. DINIT011, DINIT012, and DINIT013 install the DDs and data for the Language file, and are called by DINIT.

Here is a routine-by-routine breakdown of what they do:

DINIT
DINIT is both the main entry point and the master-control routine for Fileman initialization.

It is called at the top and performs the installation in four not-clearly documented steps:

1) ask all the init questions, 2) install the two foundational files (DD and File), 3) install the three files all the other Fileman files might point to and the code might use (MUMPS Operating System, Dialog, and Language), and 4) install the rest of the Fileman files. Subroutine OSETC handles step three.

Here is the part of DINIT that involves the Language file:

K ^UTILITY(U,$J),^UTILITY("DIK",$J) W !!,"Now loading DIALOG and LANGUAGE Files" S DN="^DINIT" F R=1:1:39 D @(DN_$$B36(R)) W "." S $P(^DIC(.84,0),U,1,2)="DIALOG^.84",$P(^DI(.84,0),U,1,2)="DIALOG^.84I" I $D(^DIC(.84,0,"GL")) D A1^DINIT3 S $P(^DIC(.85,0),U,1,2)="LANGUAGE^.85",$P(^DI(.85,0),U,1,2)="LANGUAGE^.85I" I $D(^DIC(.85,0,"GL")) D A1^DINIT3 F I=.84,.841,.842,.844,.845,.847,.8471,.85 D XX^DINIT3 D DATA Q       ; DATA  W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) Q:D'>0 S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=0 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 Q:'$D(^(D0,0)) S Z=^(0) D I^DITR K ^UTILITY(U,$J,DDF(1)),DDF,DDT,DTO,DFR,DFN,DTN G DATA ; B36(X) Q $$N1(X\(36*36)#36+1)_$$N1(X\36#36+1)_$$N1(X#36+1) N1(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%)

Here is the same part annotated and refactored for clarity:

K ^UTILITY(U,$J) ; clear the data-tranport global K ^UTILITY("DIK",$J) ; clear the reindexing global W !!,"Now loading DIALOG and LANGUAGE Files" ;       ; The first thirty-nine handle Dialog and Language, ; a group of thirty-six for Dialog, a group of three for Language. ; Each group starts with routines that load the File file entry and the DD for that file, ; then routines that load its data-transport global ^UTILITY(“^”,$J,DD #,*). S DN="^DINIT" ; unlike most packages, all FM data-transport routines start with DINIT, not DIN F R=1:1:39 D @(DN_$$B36(R)) W "." ; call each data-transport routine and write dots ;       S $P(^DIC(.84,0),U,1,2)="DIALOG^.84" ; Set the File file stub entry for the Dialog file S $P(^DI(.84,0),U,1,2)="DIALOG^.84I"; Set the data file stub entry for the Dialog file I $D(^DIC(.84,0,"GL")) D A1^DINIT3; Set the security for the Dialog file ;       S $P(^DIC(.85,0),U,1,2)="LANGUAGE^.85" ; Set the File file stub entry for the Language file S $P(^DI(.85,0),U,1,2)="LANGUAGE^.85I" ; Set the data file stub entry for the language file I $D(^DIC(.85,0,"GL")) D A1^DINIT3 ; Set the security for the Language file ;       ; re-cross-reference Dialog & Language file DDs ; and those of their subfiles F I=.84,.841,.842,.844,.845,.847,.8471,.85 D XX^DINIT3 ;       D DATA ;       QUIT  ; end of OSETC ;       ; DATA   ; install data for one data file ; input: ^utility(“^”,$j,file #,*) for each file ; output: data is loaded into each data file ;       W "." S (D,DDF(1),DDT(0))=$O(^UTILITY(U,$J,0)) ; which data file is next (.84, then .85) Q:D'>0 ; end DATA if no more data files to install ;       S DTO=0 ; control flag for I^DITR S DMRG=1 ; control flag for I^DITR ;       ; set the data-file header S DTO(0)=^(D) ; open root of the data file ; **NAKED** S Z=^(D)_"0)" ; closed root of the data-file header ; **NAKED**       S D0=^(D,0) ; data-file header ; **NAKED**        S @Z=D0 ; set the data-file header        ;        S DFR(1)="^UTILITY(U,$J,DDF(1),D0," ; open root for any Record in any file ;       S DKP=0 ; tell I^DITR to kill the old Record’s indexes ;       ; traverse Records in transport global, install each one F D0=0:0 D Q:’$D(^(D0,0)) . S D0=$O(^UTILITY(U,$J,DDF(1),D0)) ; get next Record # to install . S:D0="" D0=-1 ; old backward-compatible code from $next conversion . Q:'$D(^(D0,0)) ; quit when out of Records to install . S Z=^(0) ; load Record’s header node . D I^DITR ; install the whole Record using Fileman transfer/merge ;       K ^UTILITY(U,$J,DDF(1)) ; clear this file from the data-transport global K DDF,DDT,DTO,DFR,DFN,DTN ; clear the install variables ;       GOTO DATA ; loop back up to DATA ; end of DATA ;       ;        ; converts a base-10 number to base 36 padded to 3 digits ; input: X = base-10 number to convert, e.g. 26 ; output = 3-digit base-16 equivalent, e.g. 00Q B36(X) Q $$N1(X\(36*36)#36+1)_$$N1(X\36#36+1)_$$N1(X#36+1) ;       ; convert a decimal numeral to base-16 equivalent -1 ; input: % = base-10 numeral to convert, e.g. 26 ; output = base-16 numeral -1, e.g. P (1 less than Q) N1(%) Q $E("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",%) ;       ; EOR    ; end of routine DINIT

All of this in DINIT that applies to the Language file is top-level control-flow logic, so none of it needs to change to update the Language, and DINIT3 probably won’t either, though we’ll check. Probably, all we have to change is in the three long DINIT routines that deal with the Language file - DINIT011, DINIT012, and DINIT013.

DINIT3
Among other things, DINIT3 re-cross-references many of Fileman's files, including the Language file, in subroutine DIK. Here’s the line in question:

F DIK="^DIC(.2,","^DIPT(","^DIST(1.2,","^DIST(.44,","^DI(.81,","^DIST(.403,","^DIST(.404,","^DIST(.46,","^DI(.85,","^DD(""IX"",","^DD(""KEY""," D X

It also includes subroutine A1, which is called by OSETC^DINIT during the main processing of the Language file to set the file’s security. Note that this file allows read access, but not delete, LAYGO, write, or DD access:

A1    S (^("DEL"),^("LAYGO"),^("WR"),^("DD"))=U Q

It also includes subroutine XX, which is also called by OSETC^DINIT; it re-cross-references the Language file's DD:

XX    S DA(1)=I,DIK="^DD("_I_"," X      W ".." G IXALL^DIK

This is all supporting utility code for DINIT, so none of it needs to be updated to reflect our new Language file.

DINIT011
DINIT011 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;13JAN2011

DINIT012
DINIT012 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;2APR2004

DINIT013
DINIT013 ; SFISC/TKW-DIALOG & LANGUAGE FILE INITS ;9:34 AM  7 Aug 2002

Actual modifications made to DINIT
The acutal modifications made to DINIT build upon the changes made to DIFROM (see this blog post) to make it transport v2 of the language file are as follows:

OSETC+18: Kill off old file data K ^DIC(.85),^DD(.85),^DD(.8501),^DD(.8502),^DI(.85) ; VEN/SMH - Kill the language file old DD, DIC and data. (22.2)

OSETC+22: New subfile DD's (.8501 and .8502) are re-indexed as well F I=.84,.841,.842,.844,.845,.847,.8471,.85,.8501,.8502 D XX^DINIT3 ; VEN/SMH - added .8501 and .8502 for new lang file

OSETC+23-33: Install New Style Indexes and Keys: ; Keys and new style indexes installer ; new in FM V22.2 N DIFRSA S DIFRSA=$NA(^UTILITY("KX",$J)) ; Tran global for Keys and Indexes N DIFRFILE S DIFRFILE=0 ; Loop through files F S DIFRFILE=$O(@DIFRSA@("IX",DIFRFILE)) Q:'DIFRFILE  D . K ^TMP("DIFROMS2",$J,"TRIG") . N DIFRD S DIFRD=0 . F S DIFRD=$O(@DIFRSA@("IX",DIFRFILE,DIFRD)) Q:'DIFRD  D DDIXIN^DIFROMSX(DIFRFILE,DIFRD,DIFRSA) ; install New Style Indexes . K ^TMP("DIFROMS2",$J,"TRIG") . S DIFRD=0 . F S DIFRD=$O(@DIFRSA@("KEY",DIFRFILE,DIFRD)) Q:'DIFRD  D DDKEYIN^DIFROMSY(DIFRFILE,DIFRD,DIFRSA) ; install keys K @DIFRSA ; kill off tran global

DATA+1: Kill D1 every time we do a loop because it leaks from symbol table causing MATCHKEY^DITR1 to fail thus not installing any data. S DTO=0,DMRG=1,DTO(0)=^(D),Z=^(D)_"0)",D0=^(D,0),@Z=D0,DFR(1)="^UTILITY(U,$J,DDF(1),D0,",DKP=0 F D0=0:0 S D0=$O(^UTILITY(U,$J,DDF(1),D0)) S:D0="" D0=-1 K D1 Q:'$D(^(D0,0)) S Z=^(0) D I^DITR

DINIT011-013 now contain the new data dictionary in DIFROM format. I won't print them here because they are too long.

Distributing and Installing the Extended Language File
The extended language file, comprising all languages in ISO 692-2, will be distributed via DILAINITs produced via DIFROM. The DINIT routines will only install in the language file the following languages:

ARABIC ENGLISH FINNISH FRENCH GERMAN GREEK HEBREW ITALIAN PORTUGUESE RUSSIAN SPANISH

Licensing
Copyright 2012 Fredrick D.S. Marshall and Sam Habiel

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

System Requirements
VA Fileman V22 patched up 2/11. DO NOT INSTALL OVER MSC FILEMAN ANY VERSION. A VERSION FOR 22.2 WILL BE COMING OUT THAT WILL BE INSTALLABLE OVER MSC FILEMAN.

Infrastructure Dependencies
VA Fileman V22 patched up 2/11

VISTA Package Dependencies
None

Downloading the Software
Download the Routine Output file from here and follow the installation instructions below.

Installation and Configuration

 * 1) Import the routines from the file system using your Mumps implementation's Routine Input from RO format utility.
 * 2) Run ^DINIT. Answer Yes to all Yes/No questions if unsure how to answer.
 * 3) Run ^DMLAINIT. Answer Yes to all Yes/No questions.

MU-beta>D ^%RI

Routine Input Utility - Converts RO file to *.m files.

Formfeed delimited ? Input device: : /home/sam/repo/lang/lang-file4mu1and2/VW-LanguageFiles-DMLAINITs-DINITs-2012-11-20.ro

Lang file inits. Run ^DINIT first and then ^DMLAINITs. GT.M 20-NOV-2012 19:44:28

Output directory : r/

DINIT    DINIT011  DINIT012  DINIT013  DMLAI001  DMLAI002  DMLAI003  DMLAI004 DMLAI005 DMLAI006  DMLAI007  DMLAINI1  DMLAINI2  DMLAINI3  DMLAINI4  DMLAINI5 DMLAINIT

GTM>D ^DINIT VA FileMan V.22.0 Initialize VA FileMan now? NO//Y SITE NAME: Vista-Office EHR// SITE NUMBER: 50// .......................... Now loading MUMPS Operating System File Do you want to change the MUMPS OPERATING SYSTEM File? NO//.... Now loading DIALOG and LANGUAGE Files.............................................................. TYPE OF MUMPS SYSTEM YOU ARE USING: GT.M(UNIX)// Now loading other FileMan files--please wait.......................................................................................... .............................................................................................................................	..........	The following files have been installed: .11    INDEX .2     DESTINATION .31    KEY .4     PRINT TEMPLATE .401   SORT TEMPLATE .402   INPUT TEMPLATE .403   FORM .404   BLOCK .44    FOREIGN FORMAT .46    IMPORT TEMPLATE .5     FUNCTION .6     DD AUDIT .7     MUMPS OPERATING SYSTEM .81    DATA TYPE .83    COMPILED ROUTINE .84    DIALOG .85    LANGUAGE 1       FILE 1.1     AUDIT 1.11    ARCHIVAL ACTIVITY 1.12    FILEGRAM HISTORY 1.13    FILEGRAM ERROR LOG 1.2     ALTERNATE EDITOR 1.521   SQLI_SCHEMA 1.52101 SQLI_KEY_WORD 1.5211  SQLI_DATA_TYPE 1.5212  SQLI_DOMAIN 1.5213  SQLI_KEY_FORMAT 1.5214  SQLI_OUTPUT_FORMAT 1.5215  SQLI_TABLE 1.5216  SQLI_TABLE_ELEMENT 1.5217  SQLI_COLUMN 1.5218  SQLI_PRIMARY_KEY 1.5219  SQLI_FOREIGN_KEY 1.52191 SQLI_ERROR_TEXT 1.52192 SQLI_ERROR_LOG Re-indexing entries in the DIALOG file...................... Compiling all forms ... DICATT                         (#.001) DIPTED                         (#.1001) DIKC EDIT                      (#.1101) DIKC EDIT UI                   (#.1102) DIKK EDIT                      (#.3101) DIBTED                         (#.40001) DIETED                         (#.40101) DIEDIT                         (#.40201) DDGF BLOCK EDIT                (#.40301) DDGF PAGE ADD                  (#.40302) DDGF PAGE EDIT                 (#.40303) DDGF PAGE SELECT               (#.40304) DDGF FORM EDIT                 (#.40305) DDGF HEADER BLOCK EDIT         (#.40306) DDGF FIELD ADD                 (#.40401) DDGF FIELD CAPTION ONLY        (#.40402) DDGF FIELD DD                  (#.40403) DDGF FIELD FORM ONLY           (#.40404) DDGF FIELD COMPUTED            (#.40405) DDGF BLOCK ADD                 (#.40406) DDGF BLOCK DELETE              (#.40407) DDGF HEADER BLOCK SELECT       (#.40408) DDXP FF FORM1                  (#.441) DDMP SPECIFY IMPORT            (#.461) XPD EDIT BUILD                 (#1) XUEDIT CHARACTERISTICS         (#2) XUEXISTING USER                (#3) XUDEVICE MT                    (#4) XUDEVICE SDP                   (#5) XUDEVICE SPL                   (#6) XUDEVICE HFS                   (#7) XUDEVICE CHAN                  (#8) XU OPTION SCHEDULE             (#9) XUSERDEACT                     (#10) XUTM UCI ASSOC                 (#11) XUSITEPARM                     (#12) XUAUDIT                        (#13) XUREACT USER                   (#14) PRSA TD EDIT                   (#15) PRSA OT REQ                    (#16) PRSA TD DISP                   (#17) PRSA TL EDIT                   (#18) PRSA TL DISP                   (#19) PRSA LV REQ                    (#20) PRSA ED REQ                    (#21) PRSA VC POST                   (#22) PRSA PM POST                   (#23) PRSA TD TL                     (#24) PRSA TP POST1                  (#25) PRSA TE EDIT                   (#26) PRSA FEE POST                  (#27) NURA-I-SERVICE                 (#28) XU-PERSON CLASS                (#29) XUNEW USER                     (#30) SPNLPFM1                       (#31) SPNFFRM1                       (#32) SPNFFRM2                       (#33) SPNLPFM2                       (#34) XPD EDIT MP                    (#35) XPD EDIT GP                    (#36) PRCHQ1                         (#37) PRCHQ2                         (#38) PRCHQ3                         (#39) PRCHQ4                         (#40) PRCHQ5                         (#41) SPNLP FUN MES                  (#42) SPNLP FIM FM1                  (#43) SPNLP CHART FM1                (#44) SPNLP MS FM1                   (#45) SPNE ENTER/EDIT SYNONYM        (#46) LREPI                          (#47) ENPR MS                        (#48) ENPR ALL                       (#49) ENPR PRELIM                    (#50) ENPR AE                        (#51) ENPR CO                        (#52) ENPR CHG                       (#53) ABSV ADD/EDIT MASTER           (#54) XQEDTOPT                       (#55) XU-INST-EDIT                   (#56) LREPIPROT                      (#57) XUTMKE ADD                     (#58) WV PROC-FORM-1                 (#59) WV NOTIF-FORM-1                (#60) WV PATIENT-FORM-1              (#61) WV NOTIF-FORM-2                (#62) WV PROC-FORM-2-COLP            (#63) WV NOTIFPURPOSE-FORM-1         (#64) WV SITE PARAMS-FORM-1          (#65) WV REFUSED PROCEDURE-ENTRY     (#66) WV PROC-FORM-LAB               (#67) XDR RESFILE FORM               (#68) HL SITE PARAMETERS             (#69) PSB PRN EFFECTIVENESS          (#70) PSB MED LOG EDIT               (#71) PSBO DL                        (#72) PSBO WA                        (#73) PSBO ML                        (#74) PSBO MM                        (#75) PSBO PE                        (#76) PSB MISSING DOSE REQUEST       (#77) PSBO MH                        (#78) PSBO MV                        (#79) PSB MISSING DOSE FOLLOWUP      (#80) PSBO BL                        (#81) PSBO MD                        (#82) PSB NEW UD ENTRY               (#83) PSB NEW IV ENTRY               (#84) HL7 APP                        (#85) HL7 LOGICAL LINK               (#86) HL7 INTERFACE                  (#87) SPNLP ASIA MES                 (#88) PSB MED LOG EDIT IV            (#89) SPNLP FAM FM1                  (#90) SPNLP DIENER FM1               (#91) SPNLP DUSOI FM1                (#92) XU-CLINICAL TRAINEE            (#93) XUSSPKI                        (#94) INSTITUTION EDIT               (#95) PRSA LD POST                   (#96) XUDEVICE LPD                   (#97) XUDEVICE TRM                   (#98) KMPD PARAMETERS EDIT           (#99) LREPI9                         (#100) XUDEVICE RES                   (#101) PSBO BZ                        (#102) ENIT EDIT                      (#103) PXRM DIALOG EDIT               (#104) XUSITEIP                       (#105) PSB BCBU PARAMETERS            (#106) PSBO XA                        (#107) MD MAIN                        (#108) PRSP ESR POST                  (#109) PRSP EXT ABSENCE               (#110) INITIALIZATION COMPLETED IN 8 SECONDS. MU-beta>D ^DMLAINIT

This version (#22.2) of 'DMLAINIT' was created on 20-NOV-2012 (at FILEMAN.MUMPS.ORG, by MSC FileMan 22.1043)

I AM GOING TO SET UP THE FOLLOWING FILES:

.85      LANGUAGE  (including data) Note: You already have the 'LANGUAGE' File. I will OVERWRITE your data with mine.

SHALL I WRITE OVER FILE SECURITY CODES? No// Y (Yes) ARE YOU SURE EVERYTHING'S OK? No// Y (Yes) ...HMMM, I'M WORKING AS FAST AS I CAN..................... OK, I'M DONE. NOTE THAT FILE SECURITY-CODE PROTECTION HAS BEEN MADE

Verifying the Installation
To confirm installation of the new language file, run this: I $D(^DD(.85,.001,0)) W "IT WORKED"

Version 2 Language file final work to produce files
Building on the Version 2 work & Rick Marshall Sam Habiel

Version 2 Language file
Chris Richardson George Timson Nancy Anthracite John McCormack Brian Lord Greg Woodhouse David Whitten Kevin Toppenberg Ben Mehling Rick Marshall

Version 1 Language file
Marcus Werners Maureen Hoye Tami Winn Danila Manapsal Michael Ogi Don Creaven David LaLiberte Rick Marshall

Future Development
Later in 2012-2013, revisit the Language file to upgrade it to include the latest versions of the language standards esp. ISO 639-6, which include a lot more languages, dialects, and language families - and redo this process. There's no rush on that since the current generation of the data is sufficient for our current needs.

Thereafter, work with John McCormack to capture the coding systems themselves in his new coding-system file and to work out the proper distribution of entries in that file - which package should they belong to, etc. - and then distribute those coding systems with pointers back to the Language file. John's design separates the true entity we are trying to represent (the actual human language in the Language file) from the coding system that tries to represent it, and it can be updated over generations of standards (the coding system in John's coding-system file) and then link them by having the coding system point to its referent. It standardizes a pattern in the VISTA database that had been accumulating in an ad hoc and tangled way into a new, clean, extensible architecture for managing coding systems and weaving them into the VISTA architecture. We will support his architecture by making the language coding systems a guinea pig.

To Do List for future versions

 * Work with John McCormack to add Entity pointer to VW HL7 Tables file (260) and populate the field for ISO 639 entries.
 * Consider adding Signing to the Language Skills subfile of the Patient file, to better match the HL7 standard.
 * Delete the Interpreter Language subfile from the Patient file.
 * Investigate whether to delete the other Daou-added fields in the 19900 numberspace from the Patient file.