Difference between revisions of "Language File (.85)"
m (→Language File: Code Fields) |
(→Installation and Configuration) |
||
(44 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | 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. | + | 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. |
+ | |||
+ | [http://en.wiktionary.org/wiki/TLDR TL;DR] Summary: | ||
+ | Go here to download and install the file: [http://www.vistapedia.com/index.php/Language_File_%28.85%29#Installing_the_Language_File_Version_2 Installing_the_Language_File_Version_2] | ||
+ | |||
== Background for the Language File Version 2 == | == Background for the Language File Version 2 == | ||
Line 6: | Line 10: | ||
=== Meaningful-use Requirement === | === 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 | + | Stage one of meaningful use include a core objective that users be able to [[record~|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 [[record~|Record]]ed 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: | Here is the precise wording about these core objectives from the Federal Register, Vol. 75, No. 8, Wednesday, January 13, 2010, Rules and Regulations: | ||
Line 22: | Line 26: | ||
"TABLE 1—CERTIFICATION CRITERIA . . . | "TABLE 1—CERTIFICATION CRITERIA . . . | ||
− | "Proposed meaningful use Stage 1 objectives: | + | "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 professionals: Enable a user to electronically [[record~|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.' | + | "Certification criteria to support the achievement of meaningful use Stage 1 by eligible hospital: Enable a user to electronically [[record~|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.' | + | "[4] For eligible professionals the full proposed meaningful use Stage 1 objective is: '[[record~|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.' | + | "[5] For eligible hospitals the full proposed meaningful use Stage 1 objective is: '[[record~|Record]] demographics: preferred language, insurance type, gender, race, ethnicity, date of birth, date and cause of death in the event of mortality.' |
". . . | ". . . | ||
Line 38: | Line 42: | ||
"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: . . . | "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. | + | "(c) [[Record~|Record]] demographics. Enable a user to electronically [[record~|Record]], modify, and retrieve patient demographic data including preferred language, insurance type, gender, race, ethnicity, and date of birth. |
". . . | ". . . | ||
Line 46: | Line 50: | ||
"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: . . . | "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." | + | "(b) [[Record~|Record]] demographics. Enable a user to electronically [[record~|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. | 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. | ||
Line 131: | Line 135: | ||
:$G(X) DINUM=X | :$G(X) DINUM=X | ||
LAST EDITED: MAY 24,1994 | LAST EDITED: MAY 24,1994 | ||
− | HELP-PROMPT: Type a Number between 1 and 9999999999, 0 | + | HELP-[[PROMPT~|Prompt]]: Type a Number between 1 and 9999999999, 0 |
Decimal Digits | Decimal Digits | ||
DESCRIPTION: A number that is used to uniquely identify a | DESCRIPTION: A number that is used to uniquely identify a | ||
Line 150: | Line 154: | ||
INPUT TRANSFORM: K:$L(X)>30!($L(X)<1) X | INPUT TRANSFORM: K:$L(X)>30!($L(X)<1) X | ||
LAST EDITED: MAY 24,1994 | LAST EDITED: MAY 24,1994 | ||
− | HELP-PROMPT: Answer must be 1-30 characters in length. | + | HELP-[[PROMPT~|Prompt]]: Answer must be 1-30 characters in length. |
(e.g., ENGLISH, GERMAN, FRENCH) | (e.g., ENGLISH, GERMAN, FRENCH) | ||
DESCRIPTION: The descriptive name of the language | DESCRIPTION: The descriptive name of the language | ||
Line 167: | Line 171: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 7,1994 | LAST EDITED: MAR 7,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to transfer a number in Y to | DESCRIPTION: MUMPS code used to transfer a number in Y to | ||
its ordinal equivalent in this language. The | its ordinal equivalent in this language. The | ||
Line 181: | Line 185: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 7,1994 | LAST EDITED: MAR 7,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to transfer a date or date/time | DESCRIPTION: MUMPS code used to transfer a date or date/time | ||
in Y from FileMan internal format, to printable | in Y from FileMan internal format, to printable | ||
Line 196: | Line 200: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: JUN 24,1994 | LAST EDITED: JUN 24,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to transfer a date or date/time | DESCRIPTION: MUMPS code used to transfer a date or date/time | ||
in Y from FileMan internal format, to printable | in Y from FileMan internal format, to printable | ||
Line 233: | Line 237: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 18,1996 | LAST EDITED: MAR 18,1996 | ||
− | HELP-PROMPT: This is Standard MUMPS code for the output of | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code for the output of |
time only. | time only. | ||
DESCRIPTION: The code stored here will be used to get | DESCRIPTION: The code stored here will be used to get | ||
Line 243: | Line 247: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 8,1994 | LAST EDITED: MAR 8,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to transfer a number in Y to | DESCRIPTION: MUMPS code used to transfer a number in Y to | ||
its cardinal equivalent in this language. The | its cardinal equivalent in this language. The | ||
Line 256: | Line 260: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 8,1994 | LAST EDITED: MAR 8,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to convert text in Y to its | DESCRIPTION: MUMPS code used to convert text in Y to its | ||
upper-case equivalent in this language. The | upper-case equivalent in this language. The | ||
Line 268: | Line 272: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: MAR 8,1994 | LAST EDITED: MAR 8,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
DESCRIPTION: MUMPS code used to convert text in Y to its | DESCRIPTION: MUMPS code used to convert text in Y to its | ||
lower-case equivalent in this language. The | lower-case equivalent in this language. The | ||
Line 280: | Line 284: | ||
INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | INPUT TRANSFORM: K:$L(X)>245 X D:$D(X) ^DIM | ||
LAST EDITED: JUL 14,1994 | LAST EDITED: JUL 14,1994 | ||
− | HELP-PROMPT: This is Standard MUMPS code. | + | HELP-[[PROMPT~|Prompt]]: This is Standard MUMPS code. |
==== Existing File's Data ==== | ==== Existing File's Data ==== | ||
Line 286: | Line 290: | ||
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. | 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 record number 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. | + | [[Record~|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~|Record]] number exposed as a user-visible field. Usually this is done only when the [[record~|Record]]number 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. | The entries for Russian, Greek, and Hebrew were added later. | ||
Line 344: | Line 348: | ||
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. | 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 | + | 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 [[application~|Application]]s 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. | 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. | ||
Line 350: | Line 354: | ||
==== Improvements in Medsphere Fileman ==== | ==== 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. | + | 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~|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. | 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. | ||
Line 357: | Line 361: | ||
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. | 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 === | === Problems with Existing Architecture === | ||
Line 364: | Line 370: | ||
1) First, the Patient file needs to point to the Language file, but it did not. | 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 | + | 2) Second, Chris Richardson rightly concluded that although meaningful use stage one only requires a single field to [[record~|Record]] preferred language, to be truly useful it should also include a multiple that [[record~|Record]]s 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. | 3) The main options used to edit and report patient demographics did not include these new fields. | ||
Line 374: | Line 380: | ||
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 | 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. | + | 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~|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. | To meet meaningful use stage one, all these problems had to be solved. | ||
Line 512: | Line 518: | ||
This subfile was created by Chris Richardson. Greg Woodhouse and Nancy Anthracite helped brainstorm the actual representation with him. | 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 | + | 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 | STANDARD DATA DICTIONARY #2.019906 -- INTERPRETER LANGUAGE SUB-FILE | ||
Line 546: | Line 552: | ||
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. | 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 === | === Changes to Options === | ||
Line 554: | Line 560: | ||
=== Language File: New Entries === | === 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 | + | 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: | ||
+ | <pre> | ||
+ | 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. | ||
+ | </pre> | ||
+ | |||
+ | 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. | Chris Richardson populated the file with data loaded from a spreadsheet containing the ISO 639-1 and 2 data on 21 December 2010. | ||
Line 1,766: | Line 1,781: | ||
le. | 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: | + | Chris Richardson, recognizing that two fields would be needed to [[record~|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 | .85,256000.01 VW 3 LETTER ABBREVIATION ABR;1 FREE TEXT | ||
Line 1,787: | Line 1,802: | ||
INPUT TRANSFORM: K:$L(X)>2!($L(X)<2) X | INPUT TRANSFORM: K:$L(X)>2!($L(X)<2) X | ||
LAST EDITED: APR 12, 2011 | LAST EDITED: APR 12, 2011 | ||
− | HELP-PROMPT: Answer must be 2 characters in length. | + | HELP-[[PROMPT~|Prompt]]: Answer must be 2 characters in length. |
DESCRIPTION: This is derived from the ISO standards for | DESCRIPTION: This is derived from the ISO standards for | ||
abbreviations. | abbreviations. | ||
Line 1,800: | Line 1,815: | ||
=== VW HL7 Tables File === | === VW HL7 Tables File === | ||
− | + | In parallel with the upgrade to the Language file, John McCormack created the VW HL7 Tables file (260) to [[record~|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~|Application]] GROUP & [[Application~|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~|Application]] GROUP (Multiple-260.002), [2;0] | ||
+ | .01 [[APPLICATION~|Application]] GROUP (FJ4), [0;1] | ||
+ | .02 [[APPLICATION~|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 | |
+ | <pre> | ||
+ | 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] | ||
+ | </pre> | ||
− | + | Indexes and Xrefs. | |
+ | <pre> | ||
+ | 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) | ||
− | 1. | + | 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 | ||
+ | </pre> | ||
− | + | <pre> | |
+ | 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) | ||
+ | </pre> | ||
− | 5. | + | Sample Entry |
+ | <pre> | ||
+ | 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[]\") | ||
+ | </pre> | ||
− | + | === 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~|Record]] in any file | ||
+ | ; | ||
+ | S DKP=0 ; tell I^DITR to kill the old [[record~|Record]]’s indexes | ||
+ | ; | ||
+ | ; traverse [[record~|Record]]s 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~|Record]] # to install | ||
+ | . S:D0="" D0=-1 ; old backward-compatible code from $next conversion | ||
+ | . Q:'$D(^(D0,0)) ; quit when out of [[record~|Record]]s to install | ||
+ | . S Z=^(0) ; load [[record~|Record]]’s header node | ||
+ | . D I^DITR ; install the whole [[record~|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 [http://www.osehra.org/blog/modifying-difrom-support-new-style-indexes-and-keys 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 == | ||
+ | <pre> | ||
+ | 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. | ||
+ | </pre> | ||
+ | |||
+ | == 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 [https://trac.opensourcevista.net/svn/lang-file4mu1and2/VW-LanguageFiles-DMLAINITs-DINITs-2012-11-20.ro here] and follow the installation instructions below. | ||
+ | |||
+ | === Installation and Configuration === | ||
+ | # Import the routines from the file system using your Mumps implementation's Routine Input from RO format utility. | ||
+ | # Run ^DINIT. Answer Yes to all Yes/No questions if unsure how to answer. | ||
+ | # Run ^DMLAINIT. Answer Yes to all Yes/No questions. | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | == 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. |
Latest revision as of 01:04, 21 November 2012
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
Contents
- 1 Background for the Language File Version 2
- 2 Components of Language File Version 2
- 3 Language File: Data Dictionary Overhaul
- 4 Licensing
- 5 Installing the Language File Version 2
- 6 Verifying the Installation
- 7 Contributors
- 8 Future Development
- 9 To Do List for future versions
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
- Import the routines from the file system using your Mumps implementation's Routine Input from RO format utility.
- Run ^DINIT. Answer Yes to all Yes/No questions if unsure how to answer.
- 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.