Ticket #713: local_search.patch
| File local_search.patch, 72.4 kB (added by akollegger, 8 months ago) |
|---|
Another version of patch file, without absolute paths. |
-
.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> -
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 -
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 } -
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; 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 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 } -
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 -
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 */ 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>(); 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) -
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 353 354 /** 355 * Searches on given phrase via the concept word table within a sorted list of Locales 354 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 381 /** 382 * 355 383 * Finds concepts but only returns the given range 356 384 * 357 385 * @param phrase -
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 } 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. 533 562 * 563 * @deprecated use weightWords() with multiple locales instead 564 * 534 565 * @param phrase 535 566 * that was used to get this search 536 567 * @param locale … … 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 -
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 } 164 172 173 /** 174 * Returns the locales within which the user is proficient. 175 * 176 */ 177 public String getProficientLocales() { 178 return proficientLocales; 179 } 180 165 181 } -
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()); -
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 -
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) -
web/WEB-INF/messages_pt.properties
old new 1 1 header.logged.in=Entrou no sistema como 2 header.logged.out=N ão entrou no sistema2 header.logged.out=N\u00E3o entrou no sistema 3 3 header.login=Entrar no sistema 4 header.logout=Sair do sistema4 header.logout=Sair do Sistema 5 5 header.help=Ajuda 6 6 7 require.login=Voc êtem que se autenticar para continuar.7 require.login=Voc\u00EA tem que se autenticar para continuar. 8 8 9 Report.manage.title=Administração de Relatório 10 Report.manage.title=Administrar de Relatório 11 Report.title=Formulário de Relatórios 12 Report.name=Nome do Relatório 13 Report.save=Gravar Relatório 14 Report.list.title=Relatórios Existentes 15 Report.add=Novo Relatório 16 Report.retire=Suprimir Relatório(s) Selecionado(s) 17 Report.unretire=Não Suprimir Relatório(s) Selecionado(s) 18 Report.saved=Relatório Gravado 19 Report.deleted=Relatório Apagado 9 Report.manage.title=Administrar de Relat\u00F3rio 10 Report.title=Formul\u00E1rio de Relat\u00F3rios 11 Report.name=Nome do Relat\u00F3rio 12 Report.save=Gravar Relat\u00F3rio 13 Report.list.title=Relat\u00F3rios Existentes 14 Report.add=Novo Relat\u00F3rio 15 Report.retire=Suprimir Relat\u00F3rio(s) Selecionado(s) 16 Report.unretire=N\u00E3o Suprimir Relat\u00F3rio(s) Selecionado(s) 17 Report.saved=Relat\u00F3rio Gravado 18 Report.deleted=Relat\u00F3rio Apagado 20 19 21 20 Navigation.home=Pagina Inicial 22 21 Navigation.findPatient=Procurar Paciente 23 22 Navigation.findCreatePatient = Procurar/Criar Paciente 24 Navigation.dictionary=Dicion ário25 Navigation.administration=Administra ção26 Navigation.analysis=An álise23 Navigation.dictionary=Dicion\u00E1rio 24 Navigation.administration=Administra\u00E7\u00E3o 25 Navigation.analysis=An\u00E1lise 27 26 Navigation.options=Meu Perfil 28 27 29 28 general.select=Escolher 30 29 general.name=Nome 31 general.description=Descri ção30 general.description=Descri\u00E7\u00E3o 32 31 general.creator=Criador 33 32 general.createdBy=Criado por 34 general.dateCreated=Data de cria ção33 general.dateCreated=Data de cria\u00E7\u00E3o 35 34 general.voided=Anulado 36 35 general.voidedBy=Anulado por 37 general.voidReason=Motivo de Anula ção38 general.dateVoided=Data de Anula ção36 general.voidReason=Motivo de Anula\u00E7\u00E3o 37 general.dateVoided=Data de Anula\u00E7\u00E3o 39 38 general.changedBy=Alterado Por 40 general.dateChanged=Data de Altera ção39 general.dateChanged=Data de Altera\u00E7\u00E3o 41 40 general.delete=Apagar 42 41 general.deleted=Apagado 43 general.cannot.delete=N ão pode ser apagado44 general.changed=N ão pode ser alterado42 general.cannot.delete=N\u00E3o pode ser apagado 43 general.changed=N\u00E3o pode ser alterado 45 44 general.retired=Suprimido 46 general.retiredReason=Motivo de supress ão45 general.retiredReason=Motivo de supress\u00E3o 47 46 general.retiredBy=Suprimido por 48 47 general.addAnother=Adicionar Outro 49 48 general.new=Novo … … 63 62 general.true=Verdadeiro 64 63 general.false=Falso 65 64 general.cancel=Cancelar 66 general.canceled=Opera ção Cancelada65 general.canceled=Opera\u00E7\u00E3o Cancelada 67 66 general.preferred=Preferido 68 67 general.submit=Submeter 69 68 general.answer=Resposta … … 72 71 general.end=Terminar 73 72 general.format=Formatar 74 73 general.yes=Sim 75 general.no=N ão74 general.no=N\u00E3o 76 75 general.choose=Escolher 77 76 general.clear=Limpar 78 77 general.type=Tipo 79 78 general.subType=Subtipo 80 general.toggle.description=Mostrar/Esconder a Descri ção79 general.toggle.description=Mostrar/Esconder a Descri\u00E7\u00E3o 81 80 general.toggle.voided=Mostrar/Esconder Anulado 82 general.toggle.verbose=Mostrar/Esconder mais informa ção81 general.toggle.verbose=Mostrar/Esconder mais informa\u00E7\u00E3o 83 82 general.or=ou 84 83 general.value=Valor 85 84 general.none=Nenhum 86 general.instructions=Instru ções87 general.discontinued=N ão concluído88 general.discontinuedBy=N ão concluído por85 general.instructions=Instru\u00E7\u00F5es 86 general.discontinued=N\u00E3o conclu\u00EDdo 87 general.discontinuedBy=N\u00E3o conclu\u00EDdo por 89 88 general.dateStart=Data de Inicio 90 89 general.dateAutoExpire=Data de validade 91 general.dateDiscontinued=Data de cessa ção90 general.dateDiscontinued=Data de cessa\u00E7\u00E3o 92 91 general.locale=Local 93 92 general.nMore={0} Mais 94 93 general.optional=Opcional … … 101 100 general.fromDate=de 102 101 general.toDate=a 103 102 104 auth.logged.out=Voc êsaiu do sistema.103 auth.logged.out=Voc\u00EA saiu do sistema. 105 104 auth.login=Entrar no sistema 106 auth.password.invalid=Nome de usu ário/Senha inválido. Por favor tente novamente.107 auth.password.help=Para reintroduzir a senha, introduza seu nome de usu ário e seleccione a caixa "Esqueci a minha senha"108 auth.answer.invalid=A combina ção do Nome de usuário e resposta secreta inválidos. Por favor tente novamente.109 auth.question.empty=A pergunta secreta n ão foi gravada. Por favor contacte o administrador para lhe prestar ajuda para reintroduzir a senha.110 auth.question.fill= Preencha sua resposta àpergunta secreta para continuar.105 auth.password.invalid=Nome de usu\u00E1rio/Senha inv\u00E1lido. Por favor tente novamente. 106 auth.password.help=Para reintroduzir a senha, introduza seu nome de usu\u00E1rio e seleccione a caixa "Esqueci a minha senha" 107 auth.answer.invalid=A combina\u00E7\u00E3o do Nome de usu\u00E1rio e resposta secreta inv\u00E1lidos. Por favor tente novamente. 108 auth.question.empty=A pergunta secreta n\u00E3o foi gravada. Por favor contacte o administrador para lhe prestar ajuda para reintroduzir a senha. 109 auth.question.fill= Preencha sua resposta \u00E0 pergunta secreta para continuar. 111 110 auth.password.reset=A sua senha foi apagada. Por favor preencha os campos para sua nova senha. 112 111 113 header.login=Entrar no sistema 114 header.logout=Sair do Sistema 115 header.help=Ajuda 116 117 options.title=Opções do usuário 118 options.default.legend=Pré-definido 119 options.default.location=Localização Pré-definida 120 options.default.locale=Local Pré-definido 121 options.login.legend=Mudar Informação de entrada no sistema 122 options.login.username=Nome de usuário 112 options.title=Op\u00E7\u00F5es do usu\u00E1rio 113 options.default.legend=Pr\u00E9-definido 114 options.default.location=Localiza\u00E7\u00E3o Pr\u00E9-definida 115 options.default.locale=Local Pr\u00E9-definido 116 options.proficient.locales=Proficiente Locales 117 options.login.legend=Mudar Informa\u00E7\u00E3o de entrada no sistema 118 options.login.username=Nome de usu\u00E1rio 123 119 options.login.password.old=Antiga Senha 124 120 options.login.password.new=Nova Senha 125 121 options.login.password.confirm=Confirme a nova senha 126 options.login.secretQuestion.about=Voc ê pode criar ou editar a sua pergunta secreta abaixo. A pergunta secreta é usada para recuperação de senha em caso de esquecer.122 options.login.secretQuestion.about=Voc\u00EA pode criar ou editar a sua pergunta secreta abaixo. A pergunta secreta \u00E9 usada para recupera\u00E7\u00E3o de senha em caso de esquecer. 127 123 options.login.secretQuestionNew=Pergunta secreta 128 124 options.login.secretAnswerNew=Resposta Secreta 129 125 options.login.secretAnswerConfirm=Confirme a resposta secreta. 130 options.login.password.hint=(Deve ter pelo menos 6 caracteres e tem que conter pelo menos um digito num érico)131 options.notify.legend=Notifica ções126 options.login.password.hint=(Deve ter pelo menos 6 caracteres e tem que conter pelo menos um digito num\u00E9rico) 127 options.notify.legend=Notifica\u00E7\u00F5es 132 128 options.notify.internalOnly=Somente dentro do sistema 133 129 options.notify.internal=Dentro do sistema, mas notifique por e-mail para novas mensagens. 134 options.notify.internalProtected=Enviar por e-mail se poss ível dentro de sistema para proteger dados.130 options.notify.internalProtected=Enviar por e-mail se poss\u00EDvel dentro de sistema para proteger dados. 135 131