more work on WHO language support ($1592)
This commit is contained in:
parent
6bcea37785
commit
2625952ce2
|
@ -23,6 +23,7 @@ import org.hl7.fhir.r5.model.Resource;
|
|||
import org.hl7.fhir.r5.model.StringType;
|
||||
import org.hl7.fhir.r5.model.StructureDefinition;
|
||||
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
|
||||
import org.hl7.fhir.r5.utils.ToolingExtensions;
|
||||
import org.hl7.fhir.utilities.TextFile;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
import org.hl7.fhir.utilities.i18n.AcceptLanguageHeader;
|
||||
|
@ -507,5 +508,22 @@ public class LanguageUtils {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static boolean switchLanguage(Element e, String lang) {
|
||||
if (e.getProperty().isTranslatable()) {
|
||||
String cnt = getTranslation(e, lang);
|
||||
e.removeExtension(ToolingExtensions.EXT_TRANSLATION);
|
||||
if (cnt != null) {
|
||||
e.setValue(cnt);
|
||||
}
|
||||
}
|
||||
if (e.hasChildren()) {
|
||||
for (Element c : e.getChildren()) {
|
||||
if (!switchLanguage(c, lang)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -338,7 +338,7 @@ public class PatientRenderer extends ResourceRenderer {
|
|||
}
|
||||
if (!anyComplex) {
|
||||
XhtmlNode tr = tbl.tr();
|
||||
nameCell(tr, sd.getTitle()+":", sd.getDescription(), sd.getWebPath());
|
||||
nameCell(tr, getContext().getTranslated(sd.getTitleElement()), sd.getDescription(), sd.getWebPath());
|
||||
XhtmlNode td = tr.td();
|
||||
td.colspan("3");
|
||||
if (list.size() == 1) {
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
package org.hl7.fhir.utilities.i18n;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hl7.fhir.exceptions.FHIRException;
|
||||
import org.hl7.fhir.utilities.CommaSeparatedStringBuilder;
|
||||
import org.hl7.fhir.utilities.Utilities;
|
||||
import org.hl7.fhir.utilities.i18n.subtag.LanguageSubtagRegistry;
|
||||
|
||||
public class LanguageTag {
|
||||
|
||||
private String code;
|
||||
private String language;
|
||||
private String script;
|
||||
private String region;
|
||||
private String variant;
|
||||
private String extension;
|
||||
private List<String> extLang;
|
||||
private List<String> privateUse;
|
||||
private LanguageSubtagRegistry registry;
|
||||
|
||||
public LanguageTag(LanguageSubtagRegistry registry, String code) {
|
||||
this.registry = registry;
|
||||
this.code = code;
|
||||
|
||||
if (!Utilities.noString(code)) {
|
||||
String[] parts = code.split("\\-");
|
||||
int c = 0;
|
||||
int t = parts.length;
|
||||
if (!registry.hasLanguage(parts[c])) {
|
||||
throw new FHIRException("Invalid Language code '"+parts[c]+'"');
|
||||
} else {
|
||||
language = parts[c];
|
||||
c++;
|
||||
for (int i = 1; i <= 3; i++) {
|
||||
if (c < t && registry.hasExtLanguage(parts[c])) {
|
||||
if (extLang == null) {
|
||||
extLang = new ArrayList<>();
|
||||
}
|
||||
extLang.add(parts[c]);
|
||||
c++;
|
||||
}
|
||||
}
|
||||
|
||||
if (c < t && registry.hasScript(parts[c])) {
|
||||
script = parts[c];
|
||||
c++;
|
||||
}
|
||||
|
||||
if (c < t && registry.hasRegion(parts[c])) {
|
||||
region = parts[c];
|
||||
c++;
|
||||
}
|
||||
if (c < t && registry.hasVariant(parts[c])) {
|
||||
variant = parts[c];
|
||||
c++;
|
||||
}
|
||||
while (c < t && parts[c].startsWith("x")) {
|
||||
if (privateUse == null) {
|
||||
privateUse = new ArrayList<>();
|
||||
}
|
||||
privateUse.add(parts[c]);
|
||||
c++;
|
||||
}
|
||||
if (c < t) {
|
||||
throw new FHIRException( "Unable to recognise part "+(c+1)+" ('"+parts[c]+"') as a valid language part");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getLanguage() {
|
||||
return language;
|
||||
}
|
||||
|
||||
public String getScript() {
|
||||
return script;
|
||||
}
|
||||
|
||||
public String getRegion() {
|
||||
return region;
|
||||
}
|
||||
|
||||
public String getVariant() {
|
||||
return variant;
|
||||
}
|
||||
|
||||
public String getExtension() {
|
||||
return extension;
|
||||
}
|
||||
|
||||
public List<String> getExtLang() {
|
||||
return extLang;
|
||||
}
|
||||
|
||||
public List<String> getPrivateUse() {
|
||||
return privateUse;
|
||||
}
|
||||
|
||||
public String present() {
|
||||
StringBuilder b = new StringBuilder();
|
||||
b.append(registry.getLanguage(language).getDisplay());
|
||||
if (region != null) {
|
||||
b.append("/");
|
||||
b.append(registry.getRegion(region).getDisplay());
|
||||
}
|
||||
if (script != null || variant != null) {
|
||||
CommaSeparatedStringBuilder cb = new CommaSeparatedStringBuilder();
|
||||
if (script != null) {
|
||||
cb.append("Script="+ registry.getScript(script).getDisplay());
|
||||
if (variant != null) {
|
||||
cb.append("Variant="+ registry.getVariant(variant).getDisplay());
|
||||
}
|
||||
b.append(" (");
|
||||
b.append(cb.toString());
|
||||
b.append(")");
|
||||
}
|
||||
}
|
||||
return b.toString();
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -88,8 +88,29 @@ public class LanguageSubtagRegistry {
|
|||
public boolean containsVariant(String key) {
|
||||
return variants.containsKey(key);
|
||||
}
|
||||
|
||||
public VariantSubtag getVariant(String key) {
|
||||
return variants.get(key);
|
||||
}
|
||||
|
||||
public boolean hasLanguage(String subTag) {
|
||||
return languages.containsKey(subTag);
|
||||
}
|
||||
|
||||
public boolean hasExtLanguage(String subTag) {
|
||||
return extLangs.containsKey(subTag);
|
||||
}
|
||||
|
||||
public boolean hasScript(String subTag) {
|
||||
return scripts.containsKey(subTag);
|
||||
}
|
||||
|
||||
public boolean hasRegion(String subTag) {
|
||||
return regions.containsKey(subTag);
|
||||
}
|
||||
|
||||
public boolean hasVariant(String subTag) {
|
||||
return variants.containsKey(subTag);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,4 +42,12 @@ public abstract class Subtag {
|
|||
public List<String> getComments() {
|
||||
return List.copyOf(comments);
|
||||
}
|
||||
|
||||
public String getDisplay() {
|
||||
if (descriptions.size() == 0) {
|
||||
return "";
|
||||
} else {
|
||||
return descriptions.get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -145,5 +145,14 @@ public class JsonArray extends JsonElement implements Iterable<JsonElement> {
|
|||
items.remove(e);
|
||||
|
||||
}
|
||||
|
||||
public boolean has(String key) {
|
||||
for (JsonElement e : items) {
|
||||
if (e.isJsonString() && key.equals(e.asString())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue