Language File (.85)

From VistApedia
Jump to: navigation, search

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.

Changes to Options

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.

Language File: Data Dictionary Overhaul

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.

Installing the Language File Version 2

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 <No>? 
	Input device: <terminal>: /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"

Contributors

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.