Foreign Language Support

bradymiller wrote on Monday, March 23, 2009:

hey,

  I’m bumping a discussion that began in the help forum to here regarding foreign language support in OpenEMR to the developer forum:
https://sourceforge.net/forum/forum.php?thread_id=3119442&forum_id=202505

  We currently store our translation stuff in 3 tables (I dumped these tables at bottom of this message to give all the details), which are:
lang_constants      (Holds the english constants)
lang_definitions     (Contains the foreign word with references by id numbers to other two tables)
lang_languages    (simply contains foreign languages names)
  The xl() function performs the translation by basically using the id number from chosen language, the id number of the word (lang_constant) and sees if any entries in the lang_definitions table)
  In OpenEMR’s admin->language menu, users can add languages, constants, and edit translations.

  We have recently cleared out the constants and definitions tables secondary to some garbled stuff and to duplciate entries (there were about 2800 constants and 900 or so definintions (swedish some spanish)).  So it seem like out current methodology has failed.

  The question is what do we do now?

  Pimm has expressed interest in cleaning up the old tables to get the previous 2800 constants back into the database along with the thousand or so swedish translations along with perhaps some other languages.  In the interest of not wasting his time (ie needing to clean out the database again in several years) figured we may need to come up with another solution.  My database planning skill are weak at best and hoping some others had some ideas.

  My proposal is to actually make the current three tables static, so users can not modify these. We can keep track of all constants (basically string within the xl("???") functions in our code) and add during each release to the lang_constants tables.  We can also continue to add "official" translations to the lang_definitions tables and "official" languages to the lang_languages table.  This mechanism would then allow a stable ever increasing support of other languages. To allow users to customize we can make two more additional tabless (one for custom constants and one for definitions) that are basically checked by the xl() function before checking the static tables.

  The goal is to get something figured out and implemented during the next development cycle.

-Brady


– Table structure for table `lang_constants`

DROP TABLE IF EXISTS `lang_constants`;
CREATE TABLE `lang_constants` (
`cons_id` int(11) NOT NULL auto_increment,
`constant_name` varchar(255) character set utf8 collate utf8_unicode_ci default NULL,
UNIQUE KEY `cons_id` (`cons_id`),
KEY `cons_name` (`constant_name`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


– Dumping data for table `lang_constants`

LOCK TABLES `lang_constants` WRITE;
/*!40000 ALTER TABLE `lang_constants` DISABLE KEYS */;
INSERT INTO `lang_constants` VALUES (1,‘he’),(2,‘brain’),(3,‘users’);
/*!40000 ALTER TABLE `lang_constants` ENABLE KEYS */;
UNLOCK TABLES;


– Table structure for table `lang_definitions`

DROP TABLE IF EXISTS `lang_definitions`;
CREATE TABLE `lang_definitions` (
`def_id` int(11) NOT NULL auto_increment,
`cons_id` int(11) NOT NULL default ‘0’,
`lang_id` int(11) NOT NULL default ‘0’,
`definition` mediumtext character set utf8 collate utf8_unicode_ci,
UNIQUE KEY `def_id` (`def_id`),
KEY `definition` (`definition`(100))
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


– Dumping data for table `lang_definitions`

LOCK TABLES `lang_definitions` WRITE;
/*!40000 ALTER TABLE `lang_definitions` DISABLE KEYS */;
INSERT INTO `lang_definitions` VALUES (1,1,2,‘sweHe’),(2,1,3,‘SpaHe’),(3,1,4,‘GerHe’),(4,2,2,‘swebrain’),(5,2,3,‘SpaBrain’);
/*!40000 ALTER TABLE `lang_definitions` ENABLE KEYS */;
UNLOCK TABLES;


– Table structure for table `lang_languages`

DROP TABLE IF EXISTS `lang_languages`;
CREATE TABLE `lang_languages` (
`lang_id` int(11) NOT NULL auto_increment,
`lang_code` char(2) character set latin1 NOT NULL default ‘’,
`lang_description` varchar(100) character set utf8 collate utf8_unicode_ci default NULL,
UNIQUE KEY `lang_id` (`lang_id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


– Dumping data for table `lang_languages`

LOCK TABLES `lang_languages` WRITE;
/*!40000 ALTER TABLE `lang_languages` DISABLE KEYS */;
INSERT INTO `lang_languages` VALUES (1,‘en’,‘English’),(2,‘se’,‘Swedish’),(3,‘es’,‘Spanish’),(4,‘de’,‘German’),(5,‘du’,‘Dutch’),(6,‘he’,‘Hebrew’);
/*!40000 ALTER TABLE `lang_languages` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

blankev wrote on Monday, March 23, 2009:

Brady,

this seems a good compilation of the questions/answers raised in the HELP FORUM

The availability of Languages was in your piece a mixed up, I will come to that later.

English_constants are not complete, because not all sentences were coded as to be translated.

Some coding instructions cover the same topic but make the translation work complicated or otherwise create some abundances.

p.e.  ["date"] and ["date:"…] should both be coded as   ["date":…    ] to simplify the amount of translation coding. To find the original spots where the English_constants are defined is not easy done unless there is a programmer who can make an automated detective piece of software.

Language_definitions are very incomplete. The Dutch version is the most complete (I could recover from versions in the past) and from the 2800 English_constants there are about 900 translations available in Dutch. So to me as a user it seems a nice translation-workpiece using the Dutch translation version, but for new users it might be completely different. They can encounter at least 50% of non-translated English_definitions  during every session.

I have NO translations in Swedish, German or Hebrew.

The Spanish translation I started working on, are as most donations to OpenEMR, will be freetime investments and that is always tricky as to stipulate when that will be finished. But I started to get involvement from others.

I am not familiar with your proposed coding instructions, so I leave that to the professionals. But as far as I can read it, it seems more or less the way to go if no other geneous solution comes up.

===========================================================
This start to reanimate the translation part of OpenEMR is open form involvement:

We need to find the most extensive Language_definitions in Swedish, Spanish, German, Dutch, Hebrew and with all users find the most compatible version of translation in their language. Most probably this has to be done as a separate table comparison.

Sam B.: do you still have some oversight of OpenEMR downloads and users who implemented and are using OpenEMR on a daily basis? With a list like that we might get comparable material and see where we could be heading.

We need the text translations anyhow, if we want to make OpenEMR multilingual. So even with a different software aproach to translations we could use some kind of conversion of the upcoming tables of language_definitions.

For now I will create a spreadsheet with all three Languages available at the moment. This spreadsheet can be sorted to put the different translations next to each other for better comparison. Whoever feels the need to become involved can have a copy to compare and to complete in his or her own colum and language. Every language will be coded with their own collum language_language code. 1 for English 2 for Swedish etc.

With any intermediate completed form of this spreadsheet we can recode to make the language tables more complete step wise. But as Brady suggested, let’s keep the original clean and do the translation work in a seperate entity with some control of the Developers who implement any new release of the OpenEMR.

Pimm

blankev wrote on Tuesday, March 24, 2009:

Brady,

I might have found some solution, since all new translations in the lang_definitions get a new code we could start with a new list.

In this new list every item starts with the lang_language code and a couple of additional ZERO-s

Items in Spanish will be 30001 till 30175 and then they will be continued with the new translations in due time.

Items in the Dutch translation will be for now 50001 till 52879,
with this system we can start every new edition of OpenEMR with the related file in same ID_numbers as the English language so Code English 2280 will be 32280 Esp and 52280 Dutch

That will give us enough breathing space for the future for a total of 9999 definitions for translation and a total of 9 different languages.

I wanted to give this a try, but my versions oem go back to 2.9.0 and in that version the edit translation or save changes is not possible. Where or who can give this some exploratory workup? Or where can I include and try this new form of lang_language coding in a working OpenEMR environment? Is it possible with SQL in one of Same’s or Rod demos?

I need to make cons_id (foreign lang)  the same as lang_id (English) with the extra language number and the right amout of ZEROs.

With this system we only have to export lang_constants and lang_definitions and compare them in a spreadsheet, accept the different new translations with a English cons_id and a new comparable lang_id and in the new version all accepted coding can have a new start with new additions. No need to delete anything for old customers except for the fact that they have to compare their old files with the new OpenEMR accepted definitions. (This might sound a bit confusing, but in due time I will eleborate on this. All this is not to difficult since the English cons_id is included with the new translations.

First I want to give it a try with the available data we can retrace in older Oem versions.

BTW: the Dutch translation since Psychiatry was included have their own extra Dutch translations, but these can be retraced in the English_constants. Most probably since the Dutch extra files were never included in OpenEMR and only can be found in OpenEPR (Dutch version)

Pimm

drbowen wrote on Tuesday, March 24, 2009:

I personally think that the translations ought to be kept in separate files that can loaded as needed by the users.

Most multi-language translation software development end up with 30-40 different languages.  I have a Spanish IT provider who is going to restart the Spanish translation.  The current Spanish terms have been scrambled and are junk.  I thought these were dropped so that we can start over in 3.0.1?

I also need to have French and Russian added to the lang_language table.  I have found Russian and French volunteers to start these translations.

Most of the translators request an MS Excel table to do the translations.  I think that we will have a much easier time managing this by just letting the tables stay in the languages directory as CSV files with a script to add a language as needed.

Sam Bowen, MD

blankev wrote on Tuesday, March 24, 2009:

http://opensourceemr.com:2089/openemr/interface/main/main_screen.php?auth=login

I tried it out here and it seems to work. THe only problem is still to change the languare during a session. Change global.pgp at startup will work for any session.

I will add some more… did it al by hand since I am not sure of my SQL knowledge!!!
Also the Spanish translations might need some corrections!
I am not completely sure of all wording is also to be found in hardcoded *.php files.(These were added from memory. But this simple change of coding seems to work. I could even change US $ into British Pound, so that how I found the possibility for English translation of some texts.

New additions get a strang not compatible def_id code, but the cons_id will be the same an the lang_cons in the Lang_constants.

So after every new release the additions are going to be reorganized with their language coding in front.

If we make an additiona coding like I di of:

cons_id 110001 value "zzz_new additions" every new item will start with numbering 110001 add 1

The way to go in this OpenEMr version is:

add an constant
LOAD DEFINITION (works for English deault)
Go to wanted translation language
Fill the English Definition with your own wording
LOAD DEFINITIONS

So whenever you need to make a change in the Langue versions you have to do it by forming en new definition or make your own new Language:

PIMM Language 7 and use the constants available, after pending a new relase we have to ask those involved for their new language additions to complete the "NEW DICTIONARY".

Pimm

blankev wrote on Tuesday, March 24, 2009:

Sam,

when you get your first available translations in Spanish, even a preliminary version, could you send me a copy in SQL or Excel or CSV so I can see if the joint translation effort will work for this project?

I will continue to work on the Dutch translation as is and in due time will make a copy available for the community to be dispatched for comment and corrections.

Thanks for the input, and YES if we can find 80 linguistics for tranlation, we might have to change the coding as we have now with 1, 2, 3, 4, 5, 6 into a more International available numeric code. We could eaysy change the code into International telephone numbers:

001 for US
0031 for The Netherlands
005999 for Curacao or 0599 for the Netherland Antilles
Might have to change some field length and/or get rid of the leading zeros…?

Now considering all 186 languages an dialects it sounds logic that every language has its own file, by making a choice of neede languages at start up the total language database canbe kept to a bare minimum. But MySQL is capable op handling huge large amounts of DATA

Pimm

drbowen wrote on Tuesday, March 24, 2009:

I would prefer the international calling codes in general but this won’t work for all countries.  Several countries have multiple national languages.  For instance, South Africa, has 11 (eleven) official languages.  To get around pretty well you need to speak Africaans, Zulu, Northern Bothu and Southern Bothu (If I remember correctly).

In India, English is the official language but there a large number of regional languages.

perhaps the country code plus a two digit language code 27 for South Africa plus the language code

27Af

for South Africa - Africaans

ideaman911 wrote on Wednesday, March 25, 2009:

Folks;

Just a thought from an ignorant guy; there are two levels of operation in all software - logical and interface.  Interface can best be described as "labels" while logic requires specific syntax, and that is programming language dependent.  For example, "Guten Tag" means "Good Day", but the logic to require the input of a greeting might be written exactly the same for either a German or an English programmer using the same programming language like HTML.

It seems therefore that we could structure a table which could have an ID assigned any time a new LABEL was added to the program.  The underlying program would remain the same (except that local edits might be in other languages), but the table could then have a column for each language, with a globals.php callout of the default language "MAP".  EVERY label, then, would be defined as a variable with the language table ID, referencing the desired user language selection.

It would certainly be a more complicated programming style, and no doubt more difficult to debug because it would not be intuitive.  But that would make the program, which would remain identical globally, allow for ANY new language to simply place a new column of equivalents for that language, and their new globals.php callout.

I see no real restriction on things like phone numbers, etc, since the user would populate with the numbers in the format appropriate for their individual needs.  We simply have to make sure the data fields are large enough for all needed formats.

Just an idea.  The operative question is how many would actually benefit from this?

Joe Holzer

blankev wrote on Wednesday, March 25, 2009:

Joe,

this discussion in DEVELOPERS form is all about translation in any desired language.

Your statement is correct in that the orriginal Language is English and defined in the OpenEMR database as table:

lang_constants

Translations are now to be found in the table:

lang_defninitons

All languages defined can be found in:

lang_languages

Now if in due time we will have translations in all languages and dialects and other secret languages like Pimm’s language…hahahahha… we are struck and we should find other solutions. But my idea is that any medical or sort like Clinic will not use more that about eight languages in the same setting, except for Sam in South Africa where they use on a daily basis 11 different languages. So for the immediate future we only need two numbers in front of the code when using my idea. (read the two mails before this,  on in same discussion.) But before loading the tables in OpenEMR you have to make a decision as to what different languages you want to implement.

For me it would be:

English, Spanish, Dutch, Portuguese, Chinese one and two,  and Papiamento a local language spoken on the Dutch Antilles and available in written form. So I need seven language choices out of the available ninety eighty nine (leading zeros might give conflicting situations in MySQL tables if not defined correctly.

My seven languages can be IMPORTED/INSERTED one by one in the table or with a SQL INSERT:

lang_definitions any new addition during use of the program will be added as a surplus with a same  cons_id and different def_id.

With every new OpenEMR version we have to get all additional definitions of the users community and implement them in the official OpenEMR DEFINITIONS and Languages. From then on these new definitions are a part of the new OpenEMR versions and anybody can "at willl" add his own new definition and any new definition will have a different cons_id and def_id.

Yes it requires a team of language professionals to decide what is to be implemented in OpenEMR definitions and what translations are the most suitable, but that is just organizing matter … sounds like a new headache is created for the translator teams…

Pimm

drbowen wrote on Wednesday, March 25, 2009:

The current structure works off of an very short xml statement.  This is described in earlier forum discussions.

The current format is that there is a single code in globals.php "the language code" that causes the entire site to switch to the new language.

//Language Control Section (will add toggling)
//English:1, Swedish:2, Spanish:3, German:4,Dutch:5,Hebrew:6
define (LANGUAGE,1);

The default language is US English.  This was chosen since most of the developers live in the United Staes and most of the rest of the world uses either British or US English as the main "business language".

http://www.oemr.org/modules/wiwimod/index.php?page=LanguageTranslation

The syntax is very simple in  the code:

xl (‘translate this’)

There is a guide:

http://www.oemr.org/modules/wiwimod/index.php?page=LanguageTranslation&back=WiwiHome

Generally the default US English is used unless the language constant is changed to say "5" Dutch.  If the program looks in the lang_definitions and finds an alternative term in the #5 language it substitutes the Dutch term.  If there is no Dutch term then it returns the default US English.

We had at one time a full Swedish translation and a partial Spanish transation.  I am obviously not a Dutch expert but there were 2,700 English constants and 2,700 Dutch terms.  These were translated by Michiel Bosman and his team in The Netherlands.  He is a psychiatrist and the terms were very much for his psychiatric and counseling practitioners.

We had a database accident at some time in the past and lost the entire Swedish translation and the existing Spanish got scrambled.  There is a Dutch version that is in EPD version of OpenEMR.

The current translation code works very well and is very extensible.  We have however been forced to start from scratch with the actual translations.  We could improved on the the actual language coeds to allow more flexible future codes, countries and languages.

Brady I have been trying to find your earlier SourceForge discussions that explain this so eloquently.  Do you know which threads you had referred to earlier?

Sam Bowen, MD

bradymiller wrote on Wednesday, March 25, 2009:

hey,

previous thread here:
https://sourceforge.net/forum/forum.php?thread_id=3119442&forum_id=202505

Pimm,
By extending your logic there’s a possible way to do this with no limits to number of constants or languages.

-First, we make the three tables read only, and dump/re-install tables with each new OpenEMR version release.

-The lang_constants table is sensitive to ordering, so we can never change previous entries. So, we could start with what we had previously to not disrupt oreering (the id numbers) and make your work easier. We will need to have a script for developers that will collect all constants from our source code and order them for sanity sake, and also a script that can find new unique constants during each openemr release.

-The lang_languages table is also sensitive to ordering, so we can never change previous entries. So, we take full control and add languages that users request (again, no limit here, this list can be huge)

-The lang_definitions table is NOT sensitive to ordering, so this can be built freshly from the csv/excel translation file generated during every release.

-To allow customization, we’d need to make a custom_constants and custom_definitions table, so their user can add/modify their own constants and definitions. The xl() function could be modified to check the custom tables first.

So, to accomplish this would need to:
1) Create script to collect and find new constants in the source code
2) Make a csv/excel spreadshheet with initial listing of constants (rows) and other language (columns) definitions
3) Create script to dump this csv file into the three tables. (This csv/excel file would then be basis of scheme; we can add to it, but never modify/remove/reorder cells)

Also, to accomplish what your asking for language at login screen shouldn’t be too difficult.  Could probably just put a flag in globals.php if the user wants to select language in login screen.  Then can set this to a global variable when user logs in, and put it in logic of the xl() function (i pasted the xl function below).

-brady

function xl($constant,$mode=‘r’,$prepend=’’,$append=’’) {
    $lang_id=LANGUAGE;
   
    // utf8 compliant
  if ($GLOBALS[‘use_set_names_utf8’]) sqlQuery(“SET NAMES utf8”);
   
    $sql=“SELECT * FROM lang_definitions JOIN lang_constants ON " .
    “lang_definitions.cons_id = lang_constants.cons_id WHERE " .
    “lang_id=’$lang_id’ AND constant_name = '” .
    addslashes($constant) . “’ LIMIT 1”;
    $res=SqlStatement($sql);
    $row=SqlFetchArray($res);
    $string=$row[‘definition’];
    if ($string==’’) { $string=”$constant”; }
    $string="$prepend"."$string"."$append";
    if ($mode==‘e’){
        echo $string;
    } else {
        return $string;
    }
}

blankev wrote on Wednesday, March 25, 2009:

Sam,

how did you fare with the Spanish translators? Any progress?

Even though itmight seem that we are on different level of undestanding it is my simple impression that we all are heading to the same direction.

As soon as I get any complete Translation of the Englisg Constants I will try to prove my point and it will  be easy to understand what I see as an almost flawless design for new translation implementation.

Pimm

drbowen wrote on Wednesday, March 25, 2009:

It is a major pain not having the lang_constants in some kind of order.  It wish they were ordered either alphabetically or numerically.  It makes the translation process a lot more difficult.

Sam Bowen, MD

bradymiller wrote on Wednesday, March 25, 2009:

hey,

Actually, the only reason order of lang_constants needs to be kept is to ensure the custom_constants and custom_definitions tables work.  However, if we put a column for the actual constant in the custom_definitions table and used this instead of an id number to identify it, then you no longer need to have a set order of the lang_constants.  In your csv/excel table you could then order your rows (ie alphabetically) to make easier to work with, and this csv/excel file could be used to create the three main static tables (lang_constants, lang_languages, lang_definitions) at each openemr version release.

-brady

bradymiller wrote on Wednesday, March 25, 2009:

Note that the custom_constants and custom_definitions tables do not yet exist. They are just in my proposal discussed above.

blankev wrote on Thursday, March 26, 2009:

Sam, Brady, Joe,

I made a spreadsheet with my proposal for a start, translation is not perfect but I am in the mood to continue till language professionals take over.

Question:
Where can I send this spreadsheet so you can see that it should not be that difficult?

Or should I try to do the upload into this site:

http://opensourceemr.com:2089/openemr/interface/main/main_screen.php?auth=login

but than every moment this site will be renewed and all imports will be deleted again.

Send me a mail at:

blankev at attglobal dot net

With phpMyAdmin you should be able to import the excel file with the third collum number 1 in lang_constants

and

the others with 3 and 5 in collum three in the lang_definitions

You probably have to reorder through sort C; B; A or any different desirable  sort order before importing. But to gbet the idea I leave the sort order so you can have first row in English, second row Spanish and third row Dutch and so on.

Once imported all new English constants will continue after the last lang_constant row and all translations should be continued after the last number of the Dutch translation row.

After the import of constants the new created language rowa will get a number following the last dutch translation row.

OK NEWS: I tried it myself with CSV file and it seems to work. But cahnging of constants is still not possible of I do something wrong. It could be that I did something terible wron because by accident I deleted the lang_languages but tried to reinstall them through new Languages so sewidish is still incorrect an a name for the language.

PLEASE take a quick look before automatic reinstall will delete all changes made in my admin session.

Pimm

blankev wrote on Thursday, March 26, 2009:

It needs some finetuning, but I inserted with CSV file structure.

Pimm

ideaman911 wrote on Thursday, March 26, 2009:

Pimm et al;

Again I plead ignorance except to the intent, the problems which will be created (ignoring those of wiping away the data :frowning: and a basic "ground rules", which already appears to be understood.

In looking at the link Pimm noted, I can see that the structure would have the English "basis" or as I refer to it "label" with a box I presume is hoped to be used by whomever volunteer who wishes to create a translation.  I see that the list is sorted per an Excel sort. 

I note that all except the English have a column of NULL, which I presume are the defaults.  I think that is a mistake.  For example, if someone has translated 90% of the words to Chinese, the missing 10% will not even show up (NULL is a blank).  So it seems the NULL instead should reflect the english.  That could also allow for the tables to be a "work in progress" while still working.

I would also suggest that the sort be selectable by the user, since a Russian will think in a different order than an American.

Lastly, and this is really only to aid programmers, would be a callout of the "location used".  I do not know how best to handle multiple identical uses, nor do I know how best to express the callout and still have it monitor and change as the CVS itself changes.  Sorry, my programming skills are limited to WAY short of that.  But as a user, I still can see the merits of doing so.  In my "perfect world", I could click on that callout and it would bring me to that code location in the appropriate file, and multiples would each have a link in that "callout box".  That could assist the "context" in translation, since many of the current listing are pretty cryptic.

I simply put myself in the shoes of someone who knows little english, but comes upon this EMR and wants to try it.  A simple set of instructions should ALSO be part of the responsibility of anyone creating a language set, and it should include how to set that desired language from the default english as distributed.  And based on the South Africa model needing up to 11 languages simultaneously, it would seem that there could be something at the login screen which could select the "table used" for that session.  With the ability of most browsers to have multiple "tabs" (like Firefox) open, even with the same person logged into all (I have verified it so my client can do group therapy, and I am working on how to have the patient name in the tab instead of the generic OpenEMR - she currently effectively assigns based on physical order in front of her, but you can see the problem if they move!).  Could that same capability be used for the multiple languages simultaneously even though from a single server?

Again, I apologize for not knowing HOW to do these things.  Idea Man may be creative, and envision how things COULD be, but there is a big chasm between recognizing what is needed to win a 24 Hour race and standing on the podium at Le Mans.

Joe Holzer

bradymiller wrote on Thursday, March 26, 2009:

hey,

I think we really need a list of current constants and a mechanism to collect new constants in the future.  To this end I made a quick perl script to do this.  It’s not perfect as you can tell from some of the constant names.  I got 3549 constants!!!!

Here’s the constants (one per line):
http://www.sparmy.com/scripts/constants.txt

Here’s the perl script:
http://www.sparmy.com/scripts/collectConstants.pl

Pimm, just so I understand better what your talking about, send me your file to brady@sparmy.com

-brady

blankev wrote on Friday, March 27, 2009:

Hello Brady, Mark and others interested,

working with the Dutch translation version with my own definitions in which almost all English constants (as suggested by Brady’s Perl script) are translated, I would say a rather long list of  about 3000 translation coding, to my surprise there were still a lot of English words…

How are we ever going to change all the files into language translated files for future use?

Can this be automated through some kind of Perl script?

I looks nice to see a lot of translations on the right spot. But true translation need more than just adapting the existing English_constants… since creating a new constant… it involves changing the *.php files and that is just why translation effort were so frustrating.

Or shall we call it "OpenEMR fully translatable, with a touch on the go for those interested",

I tried to change the "$" INTO Naf (Antillean guilders), but had to stop after three changes due to frustration.

If available we should get of obliged wording in OpenEMR… and no new sentences are allowed unless needed in extreme circumstances… but that could be the death of this beautifull product.

But I will keep the Dutch translation going since it just looks great to see a product working in your own language., even with a touch of English.

WHO CAN CHANGE MY DEPRESSED MIND ON THIS???

Pimm