Ticket #713: locale_search.patch
| File locale_search.patch, 76.7 kB (added by akollegger, 8 months ago) |
|---|
Patch that provides the proposed functionality. |
-
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/.classpath
old new 5 5 <classpathentry kind="src" path="src/web"/> 6 6 <classpathentry kind="src" path="test/api"/> 7 7 <classpathentry kind="src" path="test/web"/> 8 <classpathentry kind="lib" path="lib/ant-contrib/ant-contrib-1.0b2.jar"/>9 8 <classpathentry kind="lib" path="lib/antlr/antlr_2.7.6.jar"/> 10 9 <classpathentry kind="lib" path="lib/cglib/cglib-2.1_3.jar"/> 11 10 <classpathentry kind="lib" path="lib/commons-beanutils/commons-beanutils-1.7.0.jar"/> … … 57 56 <classpathentry kind="lib" path="metadata/api/spring"/> 58 57 <classpathentry kind="lib" path="metadata/api/hibernate"/> 59 58 <classpathentry kind="lib" path="metadata/api/log4j"/> 59 <classpathentry kind="lib" path="lib/ant-contrib/ant-contrib-1.0b2.jar"/> 60 60 <classpathentry kind="output" path="build/"/> 61 61 </classpath> -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/api/ConceptService.java
old new 350 350 List<ConceptClass> requireClasses, List<ConceptClass> excludeClasses, 351 351 List<ConceptDatatype> requireDatatypes,List<ConceptDatatype> excludeDatatypes); 352 352 353 354 /** 355 * Searches on given phrase via the concept word table within a sorted list of Locales 356 * 357 * @param phrase/search/words 358 * String 359 * @param searchLocales 360 * ordered List of Locales within which to search 361 * @param includeRetired 362 * boolean 363 * @param requireClasses 364 * List<ConceptClass> 365 * @param excludeClasses 366 * List<ConceptClass> 367 * @param requireDatatypes 368 * List<ConceptDatatype> 369 * @param excludeDatatypes 370 * List<ConceptDatatype> 371 * @return 372 * 373 * @see ConceptService.findConcepts(String,Locale,boolean) 374 */ 375 @Transactional(readOnly=true) 376 @Authorized({"View Concepts"}) 377 public List<ConceptWord> findConcepts(String phrase, List<Locale> searchLocales, boolean includeRetired, 378 List<ConceptClass> requireClasses, List<ConceptClass> excludeClasses, 379 List<ConceptDatatype> requireDatatypes,List<ConceptDatatype> excludeDatatypes); 380 353 381 /** 354 382 * 355 383 * Finds concepts but only returns the given range -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/api/db/ConceptDAO.java
old new 212 212 /** 213 213 * Searches on given phrase via the concept word table 214 214 * @param phrase/search/words String 215 * @param locale Locale215 * @param locales Locales to include in search 216 216 * @param includeRetired boolean 217 217 * @param requireClasses List<ConceptClass> 218 218 * @param excludeClasses List<ConceptClass> … … 220 220 * @param excludeDatatypes List<ConceptDatatype> 221 221 * @return 222 222 */ 223 public List<ConceptWord> findConcepts(String phrase, L ocale locale, boolean includeRetired,223 public List<ConceptWord> findConcepts(String phrase, List<Locale> locales, boolean includeRetired, 224 224 List<ConceptClass> requireClasses, List<ConceptClass> excludeClasses, 225 225 List<ConceptDatatype> requireDatatypes, List<ConceptDatatype> excludeDatatypes); 226 226 -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/api/db/hibernate/HibernateConceptDAO.java
old new 499 499 } 500 500 501 501 // TODO below are functions worthy of a second tier 502 502 503 503 /** 504 504 * @see org.openmrs.api.db.ConceptService#findConcepts(java.lang.String,java.util.Locale,boolean) 505 505 */ … … 504 504 * @see org.openmrs.api.db.ConceptService#findConcepts(java.lang.String,java.util.Locale,boolean) 505 505 */ 506 506 @SuppressWarnings("unchecked") 507 public List<ConceptWord> findConcepts(String phrase, L ocale loc, boolean includeRetired,507 public List<ConceptWord> findConcepts(String phrase, List<Locale> locales, boolean includeRetired, 508 508 List<ConceptClass> requireClasses, List<ConceptClass> excludeClasses, 509 509 List<ConceptDatatype> requireDatatypes, List<ConceptDatatype> excludeDatatypes) 510 510 { 511 String locale = loc.getLanguage().substring(0, 2); //only get language portion of locale511 512 512 List<String> words = ConceptWord.getUniqueWords(phrase); //assumes getUniqueWords() removes quote(') characters. (otherwise we would have a security leak) 513 513 514 514 List<ConceptWord> conceptWords = new Vector<ConceptWord>(); … … 514 514 List<ConceptWord> conceptWords = new Vector<ConceptWord>(); 515 515 516 516 if (words.size() > 0) { 517 517 518 518 Criteria searchCriteria = sessionFactory.getCurrentSession().createCriteria(ConceptWord.class, "cw1"); 519 searchCriteria.add(Restrictions.eq("locale", locale)); 519 searchCriteria.add(Expression.in("locale", locales)); 520 // searchCriteria.add(Restrictions.eq("locale", locale)); 520 521 if (includeRetired == false) { 521 522 searchCriteria.createAlias("concept", "concept"); 522 523 searchCriteria.add(Expression.eq("concept.retired", false)); … … 531 532 .setProjection(Property.forName("concept")) 532 533 .add(Expression.eqProperty("concept", "cw1.concept")) 533 534 .add(Restrictions.like("word", w, MatchMode.START)) 534 .add( Restrictions.eq("locale", locale));535 .add(Expression.in("locale", locales)); 535 536 junction.add(Subqueries.exists(crit)); 536 537 } 537 538 searchCriteria.add(junction); … … 560 561 561 562 return conceptWords; 562 563 } 564 563 565 564 566 /** 565 567 * @see org.openmrs.api.db.ConceptService#findConcepts(java.lang.String,java.util.Locale,org.openmrs.Concept,boolean) -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/api/impl/ConceptServiceImpl.java
old new 476 476 requireDatatypes = new Vector<ConceptDatatype>(); 477 477 if (excludeDatatypes == null) 478 478 excludeDatatypes = new Vector<ConceptDatatype>(); 479 480 List<Locale> searchLocales = new ArrayList<Locale>(); 481 searchLocales.add(locale); 479 482 480 483 List<ConceptWord> conceptWords = getConceptDAO().findConcepts(phrase, 481 locale, includeRetired, requireClasses, excludeClasses, requireDatatypes, excludeDatatypes);484 searchLocales, includeRetired, requireClasses, excludeClasses, requireDatatypes, excludeDatatypes); 482 485 483 486 return weightWords(phrase, locale, conceptWords); 484 487 } … … 484 487 } 485 488 486 489 /** 490 * @see org.openmrs.api.ConceptService#findConcepts(java.lang.String, java.util.List, boolean, java.util.List, java.util.List, java.util.List, java.util.List) 491 */ 492 public List<ConceptWord> findConcepts(String phrase, 493 List<Locale> searchLocales, boolean includeRetired, 494 List<ConceptClass> requireClasses, 495 List<ConceptClass> excludeClasses, 496 List<ConceptDatatype> requireDatatypes, 497 List<ConceptDatatype> excludeDatatypes) { 498 499 if (requireClasses == null) 500 requireClasses = new Vector<ConceptClass>(); 501 if (excludeClasses == null) 502 excludeClasses = new Vector<ConceptClass>(); 503 if (requireDatatypes == null) 504 requireDatatypes = new Vector<ConceptDatatype>(); 505 if (excludeDatatypes == null) 506 excludeDatatypes = new Vector<ConceptDatatype>(); 507 508 List<ConceptWord> conceptWords = getConceptDAO(). 509 findConcepts(phrase, searchLocales, includeRetired, requireClasses, 510 excludeClasses, requireDatatypes, excludeDatatypes); 511 512 return weightWords(phrase, searchLocales, conceptWords); 513 } 514 515 /** 487 516 * 488 517 * Finds concepts but only returns the given range 489 518 * … … 529 558 530 559 /** 531 560 * This will weight and sort the concepts we are assuming the hits are 532 * sorted with synonym matches at the bottom 561 * sorted with synonym matches at the bottom. 562 * 563 * @deprecated use weightWords() with multiple locales instead 533 564 * 534 565 * @param phrase 535 566 * that was used to get this search … … 540 571 */ 541 572 protected List<ConceptWord> weightWords(String phrase, Locale locale, 542 573 List<ConceptWord> conceptWords) { 574 List<Locale> locales = new ArrayList<Locale>(); 575 locales.add(locale); 576 return weightWords(phrase, locales, conceptWords); 577 } 578 579 /** 580 * This will weight and sort the concepts we are assuming the hits are 581 * sorted with synonym matches at the bottom 582 * 583 * @param phrase 584 * that was used to get this search 585 * @param locales 586 * that were used to get this search 587 * @param conceptWords 588 * @return 589 */ 590 protected List<ConceptWord> weightWords(String phrase, List<Locale> locales, 591 List<ConceptWord> conceptWords) { 543 592 544 593 // Map<ConceptId, ConceptWord> 545 594 Map<Integer, ConceptWord> uniqueConcepts = new HashMap<Integer, ConceptWord>(); … … 564 613 // check synonym in case we have multiple synonym hits 565 614 String toSplit = initialWord.getSynonym(); 566 615 if (toSplit == null || toSplit.equals("")) { 567 ConceptName cn = initialWord.getConcept().getName(locale); 568 toSplit = cn.getName(); 616 ConceptName cn = null; 617 // find which locale provided the concept name 618 for (Locale locale : locales) { 619 cn = initialWord.getConcept().getName(locale); 620 if (cn != null) { 621 toSplit = cn.getName(); 622 break; 623 } 624 } 569 625 } 570 626 List<String> nameWords = ConceptWord.getUniqueWords(toSplit); 571 627 … … 593 649 if (matchedString.length() == 0) { 594 650 // We weight name matches higher 595 651 tmpWord.increaseWeight(2.0); 596 matchedString = tmpWord.getConcept().getName(locale) 597 .getName(); 652 for (Locale locale : locales) { 653 ConceptName cn = tmpWord.getConcept().getName(locale); 654 if (cn != null) { 655 matchedString = cn.getName(); 656 break; 657 } 658 } 598 659 } 599 660 600 661 // increase the weight by a factor of the % of words matched -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/User.java
old new 13 13 */ 14 14 package org.openmrs; 15 15 16 import java.util.ArrayList; 16 17 import java.util.Collection; 17 18 import java.util.Date; 18 19 import java.util.HashSet; … … 17 18 import java.util.Date; 18 19 import java.util.HashSet; 19 20 import java.util.Iterator; 21 import java.util.List; 22 import java.util.Locale; 20 23 import java.util.Map; 21 24 import java.util.Set; 22 25 … … 22 25 23 26 import org.apache.commons.logging.Log; 24 27 import org.apache.commons.logging.LogFactory; 28 import org.openmrs.util.LocaleFactory; 25 29 import org.openmrs.util.OpenmrsConstants; 26 30 27 31 /** … … 548 552 public String getLastName() { 549 553 return getFamilyName(); 550 554 } 555 556 /** 557 * Returns a list of Locales for which the User 558 * is considered proficient. 559 * 560 * @return List of the User's proficient locales 561 */ 562 public List<Locale> getProficientLocales() { 563 List<Locale> proficientLocales = new ArrayList<Locale>(); 564 String proficientLocalesValue = getUserProperty(OpenmrsConstants.USER_PROPERTY_PROFICIENT_LOCALES); 565 566 String[] proficientLocalesArray = proficientLocalesValue.split(","); 567 for (String proficientLocaleSpec : proficientLocalesArray) { 568 if (proficientLocaleSpec.length() > 0) { 569 proficientLocales.add(LocaleFactory.fromSpecification(proficientLocaleSpec)); 570 } 571 } 572 return proficientLocales; 573 } 551 574 } -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/util/LocaleFactory.java
old new 1 package org.openmrs.util; 2 3 4 import java.util.Collection; 5 import java.util.List; 6 import java.util.Locale; 7 import java.util.Vector; 8 9 /** 10 * A factory for creating Locales. 11 * 12 * @author <a href="mailto:akollegger@tembopublic.org">Andreas Kollegger</a> 13 */ 14 public class LocaleFactory { 15 16 /** 17 * Default internal locale. 18 * 19 * ABKTODO: this should be defined/configured somewhere else 20 */ 21 public static final Locale DEFAULT_LOCALE = Locale.ENGLISH; 22 23 /** 24 * Creates a locale based on a string specification. The specification 25 * must be conform with the following format: ll_CC_vv 26 * 27 * Where: 28 * ll two-character lowercase ISO-639 language code 29 * CC two-character uppercase ISO-3166 country code optional 30 * vv arbitrary length variant code 31 * 32 * For example: 33 * en_US_Traditional_WIN 34 * ...represents English language in the United States with the traditional collation for windows. 35 * 36 * @param localeSpecification encoded locale specification 37 * @return the representative Locale, or null if the specification is invalid 38 */ 39 public static Locale fromSpecification(String localeSpecification) 40 { 41 Locale createdLocale = null; 42 43 localeSpecification = localeSpecification.trim(); 44 45 String[] localeComponents = localeSpecification.split("_"); 46 if (localeComponents.length == 1) 47 { 48 createdLocale = new Locale(localeComponents[0]); 49 } 50 else if (localeComponents.length == 2) 51 { 52 createdLocale = new Locale(localeComponents[0], localeComponents[1]); 53 } 54 else if (localeComponents.length > 2) 55 { 56 String variant = localeSpecification.substring(localeSpecification.indexOf(localeComponents[2])); 57 createdLocale = new Locale(localeComponents[0], localeComponents[1], variant); 58 } 59 60 return createdLocale; 61 } 62 } -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/api/org/openmrs/util/OpenmrsConstants.java
old new 532 532 public static final String USER_PROPERTY_NOTIFICATION = "notification"; 533 533 public static final String USER_PROPERTY_NOTIFICATION_ADDRESS = "notificationAddress"; 534 534 public static final String USER_PROPERTY_NOTIFICATION_FORMAT = "notificationFormat"; // text/plain, text/html 535 536 /** 537 * A user property name. The value should be a comma-separated ordered 538 * list of fully qualified locales within which the user is a proficient 539 * speaker. The list should be ordered from the most to the least proficiency. 540 * 541 * Example: 542 * <code>proficientLocales = en_US, en_GB, en, fr_RW</code> 543 */ 544 public static final String USER_PROPERTY_PROFICIENT_LOCALES = "proficientLocales"; 535 545 536 546 /* 537 547 * Report object properties -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/web/org/openmrs/web/controller/OptionsFormController.java
old new 29 29 import org.openmrs.api.EncounterService; 30 30 import org.openmrs.api.UserService; 31 31 import org.openmrs.api.context.Context; 32 import org.openmrs.util.LocaleFactory; 32 33 import org.openmrs.util.OpenmrsConstants; 33 34 import org.openmrs.web.OptionsForm; 34 35 import org.openmrs.web.WebConstants; … … 101 102 102 103 properties.put(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCATION, opts.getDefaultLocation()); 103 104 properties.put(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE, opts.getDefaultLocale()); 105 properties.put(OpenmrsConstants.USER_PROPERTY_PROFICIENT_LOCALES, opts.getProficientLocales()); 104 106 properties.put(OpenmrsConstants.USER_PROPERTY_SHOW_RETIRED, opts.getShowRetiredMessage().toString()); 105 107 properties.put(OpenmrsConstants.USER_PROPERTY_SHOW_VERBOSE, opts.getVerbose().toString()); 106 108 properties.put(OpenmrsConstants.USER_PROPERTY_NOTIFICATION, opts.getNotification() == null ? "" : opts.getNotification().toString()); … … 197 199 Map<String, String> props = user.getUserProperties(); 198 200 opts.setDefaultLocation(props.get(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCATION)); 199 201 opts.setDefaultLocale(props.get(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE)); 202 opts.setProficientLocales(props.get(OpenmrsConstants.USER_PROPERTY_PROFICIENT_LOCALES)); 200 203 opts.setShowRetiredMessage(new Boolean(props.get(OpenmrsConstants.USER_PROPERTY_SHOW_RETIRED))); 201 204 opts.setVerbose(new Boolean(props.get(OpenmrsConstants.USER_PROPERTY_SHOW_VERBOSE))); 202 205 opts.setUsername(user.getUsername()); -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/web/org/openmrs/web/dwr/DWRConceptService.java
old new 75 75 76 76 log.info(userId + "|" + phrase + "|" + includeClassNames.toString()); 77 77 78 Locale locale = Context.getLocale(); 78 Locale defaultLocale = Context.getLocale(); 79 List<Locale> searchLocales = u.getProficientLocales(); 80 if (searchLocales.size() == 0) { 81 searchLocales.add(defaultLocale); 82 83 // if country is specified, also add the generic language locale 84 if (defaultLocale.getCountry() != "") { 85 searchLocales.add(new Locale(defaultLocale.getLanguage())); 86 } 87 88 } 89 79 90 if (includeClassNames == null) 80 91 includeClassNames = new Vector<String>(); 81 92 if (excludeClassNames == null) … … 94 105 // corresponding conceptId 95 106 Concept c = cs.getConcept(Integer.valueOf(phrase)); 96 107 if (c != null) { 97 ConceptWord word = new ConceptWord(phrase, c, locale108 ConceptWord word = new ConceptWord(phrase, c, defaultLocale 98 109 .getLanguage(), "Concept Id #" + phrase); 99 110 words.add(word); 100 111 } … … 128 139 excludeDatatypes.add(cs.getConceptDatatypeByName(name)); 129 140 130 141 // perform the search 131 words.addAll(cs.findConcepts(phrase, locale, includeRetired,142 words.addAll(cs.findConcepts(phrase, searchLocales, includeRetired, 132 143 includeClasses, excludeClasses, 133 144 includeDatatypes, excludeDatatypes)); 134 145 } … … 135 146 136 147 if (words.size() == 0) { 137 148 objectList 138 .add("No matches found for <b>" + phrase + "</b> in locale: " + Context.getLocale().getDisplayName());149 .add("No matches found for <b>" + phrase + "</b> in locale: " + defaultLocale); 139 150 } else { 140 151 objectList = new Vector<Object>(words.size()); 141 152 int maxCount = 500; … … 154 165 if (classId.equals(OpenmrsConstants.CONCEPT_CLASS_DRUG)) 155 166 for (Drug d : cs.getDrugs(word.getConcept())) 156 167 objectList.add(new ConceptDrugListItem(d, 157 locale));168 defaultLocale)); 158 169 } 159 170 } 160 171 } … … 166 177 } 167 178 168 179 if (objectList.size() == 0) 169 objectList.add("No matches found for <b>" + phrase + "</b> in locale: " + Context.getLocale().getDisplayName());180 objectList.add("No matches found for <b>" + phrase + "</b> in locale: " + defaultLocale); 170 181 171 182 return objectList; 172 183 } … … 348 359 Concept c = Context.getConceptService().getConcept(conceptId); 349 360 Collection<ConceptAnswer> answers = c.getAnswers(); 350 361 // TODO: deal with concept answers (e.g. drug) whose answer concept is null. (Not sure if this actually ever happens) 362 Locale locale = Context.getLocale(); 351 363 for (ConceptAnswer ca : answers) 352 364 if (ca.getAnswerConcept() != null) 353 ret.add(new ConceptListItem(ca.getAnswerConcept(), Context.getLocale()));365 ret.add(new ConceptListItem(ca.getAnswerConcept(), locale)); 354 366 return ret; 355 367 } 356 368 -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/src/web/org/openmrs/web/OptionsForm.java
old new 17 17 18 18 private String defaultLocation = ""; 19 19 private String defaultLocale = ""; 20 private String proficientLocales = ""; 20 21 private Boolean showRetiredMessage = true; 21 22 private Boolean verbose = false; 22 23 … … 160 161 this.verbose = verbose; 161 162 } 162 163 163 164 /** 165 * Sets the locales within which the user is proficient. 166 * 167 * @param proficientLocales a comma-separated list of locales 168 */ 169 public void setProficientLocales(String proficientLocales) { 170 this.proficientLocales = proficientLocales; 171 } 172 173 /** 174 * Returns the locales within which the user is proficient. 175 * 176 */ 177 public String getProficientLocales() { 178 return proficientLocales; 179 } 164 180 165 181 } -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/web/WEB-INF/messages.properties
old new 7 7 findPatient.title=OpenMRS - Find Patient 8 8 optionsForm.title=OpenMRS - User Options 9 9 cohortBuilder.title=OpenMRS - Cohort Builder 10 dictionary.title= OpenMRS - Concept Dictionary10 dictionary.title=Concept Dictionary Maintenance 11 11 12 12 13 13 Navigation.home = Home … … 121 121 general.locale=Locale 122 122 general.nMore={0} more 123 123 general.nLess={0} less 124 general.optional= Optional124 general.optional=optional 125 125 general.onDate=on 126 126 general.hide=Hide 127 127 general.drop=Drop … … 145 145 general.version=Version 146 146 general.includeVoided=Include Voided 147 147 general.dateConstraints=Date range 148 general.optional=optional149 148 general.since=since 150 149 general.nWeeks={0} week(s) 151 150 general.displayingXtoYofZ=Displaying {0} to {1} of {2} … … 177 176 diagnosis.title=Select a Diagnosis 178 177 conceptAnswer.title=Choose an Answer 179 178 conceptAnswer.forConcept= 180 181 dictionary.title=Concept Dictionary Maintenance182 179 dictionary.title.short=Dictionary 183 180 dictionary.searchBox=Search Phrase: 184 181 dictionary.includeRetired=Include retired concepts … … 219 216 options.default.legend=Defaults 220 217 options.default.location=Default Location 221 218 options.default.locale=Default Locale 219 options.proficient.locales=Proficient Locales 222 220 options.default.verbose=Verbose Display On 223 221 options.showRetiredMessage=Show Retired Message? 224 222 options.login.legend=Change Login Info … … 271 269 typeMismatch.java.lang.Long={0} is not a valid value. Do not use decimals or characters. 272 270 273 271 welcome=Welcome to <span class="webappName">{0}</span>. Please login to proceed. 274 welcomeUser=Hello, {0}. Welcome to <span class ="webappName">{1}</span>.272 welcomeUser=Hello, {0}. Welcome to <span class\="webappName">{1}</span>. 275 273 276 274 # 277 275 #### Openmrs POJO messages #### … … 335 333 Concept.add=Add new Concept 336 334 Concept.id=Concept Id 337 335 Concept.set=Is Set? 338 Concept.checkClassAndDatatype=Please ensure that this concept's class and datatype are correct. (class =Question should typically not be datatype=N/A.)336 Concept.checkClassAndDatatype=Please ensure that this concept's class and datatype are correct. (class\=Question should typically not be datatype\=N/A.) 339 337 Concept.search=Find a concept by typing in its name 340 338 Concept.view.title=Viewing Concept {0} 341 339 Concept.edit.title=Editing Concept {0} … … 658 656 Form.javascriptRequired=Javascript must be enabled to use the schema editor. 659 657 660 658 FormField.add=Add Form Field 661 FormField.fieldNumber= Field #659 FormField.fieldNumber= Field \# 662 660 FormField.fieldPart= Field Part 663 FormField.pageNumber= Page #661 FormField.pageNumber= Page \# 664 662 FormField.minOccurs= Min 665 663 FormField.maxOccurs= Max 666 664 FormField.maxOccurs.help=-1 for infinite … … 801 799 Obs.valueModifier=Value Modifier 802 800 Obs.valueText=Value Text 803 801 Obs.valueInvalid.description=Invalid Concept Selected! 804 Obs.valueInvalid.didYouMean=Did you mean the concept to be :802 Obs.valueInvalid.didYouMean=Did you mean the concept to be\: 805 803 Obs.dateStarted=Date Started 806 804 Obs.dateStopped=Date Stopped 807 805 Obs.comment=Comment … … 1138 1136 RelationshipType.null=Relationship type cannot be null 1139 1137 RelationshipType.aIsToB=A is to B 1140 1138 RelationshipType.bIsToA=B is to A 1141 RelationshipType.bIsToA.required=A is to B name is required1142 1139 RelationshipType.bIsToA.required=B is to A name is required 1143 1140 RelationshipType.views.title=Manage Relationship Type Views 1144 1141 RelationshipType.views.order=Display Order … … 1159 1156 Role.add=Add Role 1160 1157 Role.inheritedRoles=Inherited Roles 1161 1158 Role.inheritedRoles.description=<span class="thisRole">This role</span> inherits privileges from these roles 1162 Role.inheritingRoles.description=Roles that contain (inherit privileges from) <span class ="thisRole">this role</span>1159 Role.inheritingRoles.description=Roles that contain (inherit privileges from) <span class\="thisRole">this role</span> 1163 1160 Role.privileges=Privileges 1164 1161 Role.list.title=Current Roles 1165 1162 Role.delete=Delete Selected Roles … … 1355 1352 Module.loaded=Module {0} has been loaded 1356 1353 Module.stopped=Module {0} has been stopped 1357 1354 Module.error=Error processing Module 1358 Module.add=Add Module1359 1355 Module.addJar=Module file to add 1360 1356 Module.invalid=Invalid module specified {0} 1361 1357 Module.notStarted=Not Started … … 1368 1364 Module.help.unload=When a module is unloaded, it is first 'stopped', then the omod file is removed from the repository. 1369 1365 Module.help.startStop=A loaded module can be stopped and started. A stopped module is still loaded, it just doesn't have any effect on the system. 1370 1366 Module.help.update=In order to update a module, either click 'Install Update' or: 1) Download the update, 2) unload the current module then 3) upload the new module via the form above. 1371 Module.help.findMore=Find and download more modules in the <a target ="moduleRepository" href="https://dev.openmrs.org/modules">OpenMRS Module Repository</a>1367 Module.help.findMore=Find and download more modules in the <a target\="moduleRepository" href\="https\://dev.openmrs.org/modules">OpenMRS Module Repository</a> 1372 1368 Module.unloadWarning=You are about to completely remove this module from the system. 1373 1369 Module.allowUploads=Allow Uploads? 1374 1370 Module.disallowUploads=Uploads are not allowed from the website at this time. The runtime property {0} must be set to true. … … 1433 1429 1434 1430 Scheduler.scheduleForm.title=Schedule Form 1435 1431 Scheduler.scheduleForm.legend=Schedule 1436 Scheduler.scheduleForm.instructions=PLEASE NOTE : Changes to the schedule below are NOT passed onto task instances that are already running. After saving your changes, you MUST stop/start the desired task on the Task List page in order to pass these schedule changes onto that task.1432 Scheduler.scheduleForm.instructions=PLEASE NOTE\: Changes to the schedule below are NOT passed onto task instances that are already running. After saving your changes, you MUST stop/start the desired task on the Task List page in order to pass these schedule changes onto that task. 1437 1433 Scheduler.scheduleForm.started=Started 1438 1434 Scheduler.scheduleForm.startOnStartup=Start on startup 1439 1435 Scheduler.scheduleForm.startTimePattern=Start time pattern … … 1487 1483 Program.states=States 1488 1484 Program.state=State 1489 1485 Program.conversion.manage=Manage Triggered State Conversions 1490 Program.conversion.saved=Trigger State Conversion saved1486 Program.conversion.saved=Triggered state conversion has been saved 1491 1487 Program.conversion.manage.title=Triggered State Conversions 1492 1488 Program.conversion.programWorkflow=In this workflow 1493 1489 Program.conversion.concept=This concept … … 1495 1491 Program.conversion.list.title=Current Triggered State Conversions 1496 1492 Program.conversion.add=Add new state conversion 1497 1493 Program.conversion.save=Save this state conversion 1498 Program.conversion.saved=Triggered state conversion has been saved1499 1494 Program.conversion=Triggered State Conversion 1500 1495 Program.conversion.nonedeleted=No Triggered State Conversions deleted 1501 1496 Program.conversion.deleteSelected=Delete selected Triggered State Conversion(s) -
/Users/akollegger/Developer/OpenMRS/workspace/openmrs-trunk/web/WEB-INF/messages_fr.properties
old new 1 header.logged.in=Vous êtes entrés comme2 header.logged.out=Non entr é3 header.login= Ouverture4 header.logout=Sorti e du Système1 header.logged.in=Vous \u00EAtes entr\u00E9s comme 2 header.logged.out=Non entr\u00E9 3 header.login=Entrer 4 header.logout=Sortir 5 5 header.help=Aide 6 6 7 require.login=Vous devez ouvrir une session pour continuer .7 require.login=Vous devez ouvrir une session pour continuer 8 8 9 Report.manage.title=Report Management10 9 Report.manage.title=Manage Reports 11 10 Report.title=Report Form 12 11 Report.name=Report Name … … 20 19 21 20 Navigation.home=Accueil 22 21 Navigation.findPatient=Chercher un patient 23 Navigation.findCreatePatient = Chercher/cr éer un patient22 Navigation.findCreatePatient = Chercher/cr\u00E9er un patient 24 23 Navigation.dictionary=Dictionnaire 25 24 Navigation.administration=Administration 26 25 Navigation.analysis=Analyse … … 29 28 general.select=Choisir 30 29 general.name=Nom 31 30 general.description=Description 32 general.creator=cr éateur33 general.createdBy=Cr éépar34 general.dateCreated=Date cr éée35 general.voided=Supprim é36 general.voidedBy=Supprim épar37 general.voidReason=Raison Supprim é38 general.dateVoided=Date Supprim é39 general.changedBy=Chang épar31 general.creator=cr\u00E9ateur 32 general.createdBy=Cr\u00E9\u00E9 par 33 general.dateCreated=Date cr\u00E9\u00E9e 34 general.voided=Supprim\u00E9 35 general.voidedBy=Supprim\u00E9 par 36 general.voidReason=Raison Supprim\u00E9 37 general.dateVoided=Date Supprim\u00E9 38 general.changedBy=Chang\u00E9 par 40 39 general.dateChanged=Date de changement 41 40 general.delete=Supprimer 42 general.deleted=Supprim é43 general.cannot.delete=Ne peut pas être supprimé44 general.changed=cannot be changed =Ne peut pas être changé45 general.retired=Supprim é46 general.retiredReason=Raison supprim é41 general.deleted=Supprim\u00E9 42 general.cannot.delete=Ne peut pas \u00EAtre supprim\u00E9 43 general.changed=cannot be changed\=Ne peut pas \u00EAtre chang\u00E9 44 general.retired=Supprim\u00E9 45 general.retiredReason=Raison supprim\u00E9 47 46 general.retiredBy=Add=Ajouter 48 47 general.addAnother=Ajouter un autre 49 48 general.new=Nouveau … … 51 50 general.save=Sauvegarder (Enregistrer) 52 51 general.remove=Enlever 53 52 general.view=Voir 54 general.move_up=D éplacement en haut55 general.move_down=D éplacement en bas53 general.move_up=D\u00E9placement en haut 54 general.move_down=D\u00E9placement en bas 56 55 general.search=Chercher 57 56 general.searchButton=Chercher 58 57 general.change=Changer 59 general.id=Identit é(Id)58 general.id=Identit\u00E9 (Id) 60 59 general.continue=Continuer 61 general.previous=Pr écédent60 general.previous=Pr\u00E9c\u00E9dent 62 61 general.next=Prochaine 63 62 general.true=Vrai 64 63 general.false=Faux … … 63 62 general.true=Vrai 64 63 general.false=Faux 65 64 general.cancel=Terminer 66 general.canceled=Action termin é67 general.preferred=Pr éféré65 general.canceled=Action termin\u00E9 66 general.preferred=Pr\u00E9f\u00E9r\u00E9 68 67 general.submit=Soumettre 69 general.answer=R épondre70 general.download=T élécharger71 general.start=D ébut68 general.answer=R\u00E9pondre 69 general.download=T\u00E9l\u00E9charger 70 general.start=D\u00E9but 72 71 general.end=Bout 73 72 general.format=Format 74 73 general.yes=Oui … … 78 77 general.type=Type 79 78 general.subType=Sous-type 80 79 general.toggle.description=Montrer/cacher description 81 general.toggle.voided=Montrer/cacher options supprim és80 general.toggle.voided=Montrer/cacher options supprim\u00E9s 82 81 general.toggle.verbose=Montrer/cacher plus d'information 83 82 general.or=ou 84 83 general.value=Valeur … … 84 83 general.value=Valeur 85 84 general.none=Aucun 86 85 general.instructions=Instructions 87 general.discontinued=Cess é88 general.discontinuedBy=Cess épar89 general.dateStart=Date de d ébut90 general.dateAutoExpire=Date de cessation programm é86 general.discontinued=Cess\u00E9 87 general.discontinuedBy=Cess\u00E9 par 88 general.dateStart=Date de d\u00E9but 89 general.dateAutoExpire=Date de cessation programm\u00E9 91 90 general.dateDiscontinued=Date de cessation 92 91 general.locale=Lieu 93 92 general.nMore={0} en plus … … 99 98 general.drop=Eliminer 100 99 general.loading=Chargement... 101 100 general.fromDate=depuis 102 general.toDate=jusqu' à101 general.toDate=jusqu'\u00E0 103 102 104 auth.logged.out=Votre session est ferm é103 auth.logged.out=Votre session est ferm\u00E9 105 104 auth.login=Identifiez-vous 106 auth.password.invalid=Le nom d'utilisateur et le mot de passe ne correspondent pas. Prière d'essayer une autre fois. 107 auth.password.help=Pour remettre à zéro votre mot de passe, entrer votre identification et cheque la boîte: "j'ai oublié mon mot de passe" 108 auth.answer.invalid=Mot de passe avec la réponse secrète inadmissible. Prière d'essayer une autre fois. 109 auth.question.empty=Prière de contacter un administrateur pour remettre à zéro votre mot de passe 110 auth.question.fill= Compléter votre réponse à la question secrète 111 auth.password.reset=Votre mot de passe a eté remis à zéro. Prière de remplir les bôites pour votre nouveau mot de passe. 112 113 header.login=Entrer 114 header.logout=Sortir 115 header.help=Aide 105 auth.password.invalid=Le nom d'utilisateur et le mot de passe ne correspondent pas. Pri\u00E8re d'essayer une autre fois. 106 auth.password.help=Pour remettre \u00E0 z\u00E9ro votre mot de passe, entrer votre identification et cheque la bo\u00EEte\: "j'ai oubli\u00E9 mon mot de passe" 107 auth.answer.invalid=Mot de passe avec la r\u00E9ponse secr\u00E8te inadmissible. Pri\u00E8re d'essayer une autre fois. 108 auth.question.empty=Pri\u00E8re de contacter un administrateur pour remettre \u00E0 z\u00E9ro votre mot de passe 109 auth.question.fill= Compl\u00E9ter votre r\u00E9ponse \u00E0 la question secr\u00E8te 110 auth.password.reset=Votre mot de passe a et\u00E9 remis \u00E0 z\u00E9ro. Pri\u00E8re de remplir les b\u00F4ites pour votre nouveau mot de passe. 116 111 117 112 options.title=Votres options 118 options.default.legend=Défaut 119 options.default.location=Location de défaut 120 options.default.locale=Addresse de défaut 121 options.login.legend=Changer vôtre compte 113 options.default.legend=D\u00E9faut 114 options.default.location=Location de d\u00E9faut 115 options.default.locale=Addresse de d\u00E9faut 116 options.proficient.locales=Proficient Locales 117 options.login.legend=Changer v\u00F4tre compte 122 118 options.login.username=Nom d'utilisateur 123 119 options.login.password.old=Vieux mot de passe 124 120 options.login.password.new=Nouveau mot de passe&nbs