diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/CodeSystemRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/CodeSystemRenderer.java index 5f8dcf507..620b285e1 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/CodeSystemRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/CodeSystemRenderer.java @@ -23,6 +23,7 @@ import org.hl7.fhir.r5.model.CodeSystem.PropertyComponent; import org.hl7.fhir.r5.model.Coding; import org.hl7.fhir.r5.model.Enumeration; import org.hl7.fhir.r5.model.Extension; +import org.hl7.fhir.r5.model.PrimitiveType; import org.hl7.fhir.r5.model.Resource; import org.hl7.fhir.r5.model.StringType; import org.hl7.fhir.r5.renderers.CodeSystemRenderer.Translateable; @@ -445,7 +446,7 @@ public class CodeSystemRenderer extends TerminologyRenderer { if (hasDisplay) { td = tr.td(); - renderDisplayName(c, cs, td); + hasExtensions = renderDisplayName(c, cs, td, langs) || hasExtensions; } if (hasDefinitions) { td = tr.td(); @@ -459,7 +460,7 @@ public class CodeSystemRenderer extends TerminologyRenderer { } } - if (getContext().getMultiLanguagePolicy() == MultiLanguagePolicy.NONE && (sl || ToolingExtensions.hasLanguageTranslations(defn))) { + if (getContext().getMultiLanguagePolicy() == MultiLanguagePolicy.NONE || !(sl || ToolingExtensions.hasLanguageTranslations(defn))) { if (hasMarkdownInDefinitions(cs)) { addMarkdown(renderStatusDiv(defn, td), defn.asStringValue()); } else { @@ -469,6 +470,7 @@ public class CodeSystemRenderer extends TerminologyRenderer { List list = new ArrayList<>(); list.add(new Translateable(cs.getLanguage(), defn)); for (Extension ext : defn.getExtensionsByUrl(ToolingExtensions.EXT_TRANSLATION)) { + hasExtensions = true; list.add(new Translateable(ext.getExtensionString("lang"), ext.getExtensionByUrl("content").getValueStringType())); } for (ConceptDefinitionDesignationComponent cd : c.getDesignation()) { @@ -525,39 +527,30 @@ public class CodeSystemRenderer extends TerminologyRenderer { if (comment) { td = tr.td(); Extension ext = c.getExtensionByUrl(ToolingExtensions.EXT_CS_COMMENT); - if (ext != null) { + if (ext != null && ext.hasValue() && ext.getValue().primitiveValue() != null) { hasExtensions = true; - String bc = ext.hasValue() ? ext.getValue().primitiveValue() : null; - Map translations = ToolingExtensions.getLanguageTranslations(ext.getValue()); - - if (getContext().getLang() == null) { - if (bc != null) - td.addText(bc); - } else if (getContext().getLang().equals("*")) { - boolean sl = false; - for (String l : translations.keySet()) - if (bc == null || !bc.equalsIgnoreCase(translations.get(l))) - sl = true; - if (bc != null) { - td.addText((sl ? cs.getLanguage("en")+": " : "")+bc); - } - for (String l : translations.keySet()) { - if (bc == null || !bc.equalsIgnoreCase(translations.get(l))) { - if (!td.getChildNodes().isEmpty()) - td.br(); - td.addText(l+": "+translations.get(l)); - } - } - } else if (getContext().getLang().equals(cs.getLanguage()) || (getContext().getLang().equals("en") && !cs.hasLanguage())) { - if (bc != null) - td.addText(bc); + StringType defn = context.getTranslatedElement((PrimitiveType) ext.getValue()); + if (getContext().getMultiLanguagePolicy() == MultiLanguagePolicy.NONE ||!(ToolingExtensions.hasLanguageTranslations(ext.getValue()))) { + td.addText(defn.asStringValue()); } else { - if (bc != null) - translations.put(cs.getLanguage("en"), bc); - for (String l : translations.keySet()) { - if (l.equals(getContext().getLang())) { - td.addText(translations.get(l)); + List list = new ArrayList<>(); + list.add(new Translateable(cs.getLanguage(), defn)); + for (Extension ex : defn.getExtensionsByUrl(ToolingExtensions.EXT_TRANSLATION)) { + hasExtensions = true; + list.add(new Translateable(ex.getExtensionString("lang"), ex.getExtensionByUrl("content").getValueStringType())); + } + boolean first = true; + for (Translateable ti : list) { + if (first) { + first = false; + } else { + td.br(); } + + if (ti.lang != null) { + td.addText(ti.lang + ": "); + } + renderStatus(ti.getValue(), td).addText(ti.getValue().asStringValue()); } } } @@ -633,7 +626,7 @@ public class CodeSystemRenderer extends TerminologyRenderer { a.addText(cc.getCode()); if (hasDisplay) { td = tr.td(); - renderDisplayName(cc, cs, td); + hasExtensions = renderDisplayName(cc, cs, td, langs) || hasExtensions; } int w = 1 + (deprecated ? 1 : 0) + (comment ? 1 : 0) + (version ? 1 : 0) + maps.size(); if (properties != null) { @@ -676,32 +669,44 @@ public class CodeSystemRenderer extends TerminologyRenderer { } - public void renderDisplayName(ConceptDefinitionComponent c, CodeSystem cs, XhtmlNode td) { + public boolean renderDisplayName(ConceptDefinitionComponent c, CodeSystem cs, XhtmlNode td, List langs) { + boolean hasExtensions = false; if (c.hasDisplayElement()) { - if (getContext().getLang() == null) { - renderStatus(c.getDisplayElement(), td).addText(c.getDisplay()); - } else if (getContext().getLang().equals("*")) { - boolean sl = false; - for (ConceptDefinitionDesignationComponent cd : c.getDesignation()) - if (cd.getUse().is("http://terminology.hl7.org/CodeSystem/designation-usage", "display") && cd.hasLanguage() && !c.getDisplay().equalsIgnoreCase(cd.getValue())) - sl = true; - td.addText((sl ? cs.getLanguage("en")+": " : "")+c.getDisplay()); - for (ConceptDefinitionDesignationComponent cd : c.getDesignation()) { - if (cd.getUse().is("http://terminology.hl7.org/CodeSystem/designation-usage", "display") && cd.hasLanguage() && !c.getDisplay().equalsIgnoreCase(cd.getValue())) { - td.br(); - td.addText(cd.getLanguage()+": "+cd.getValue()); - } + StringType disp = c.getDisplayElement(); + List list = new ArrayList<>(); + list.add(new Translateable(cs.getLanguage(), disp)); + for (Extension ext : disp.getExtensionsByUrl(ToolingExtensions.EXT_TRANSLATION)) { + if (!langs.contains(ext.getExtensionString("lang"))) { + hasExtensions = true; + list.add(new Translateable(ext.getExtensionString("lang"), ext.getExtensionByUrl("content").getValueStringType())); } - } else if (getContext().getLang().equals(cs.getLanguage()) || (getContext().getLang().equals("en") && !cs.hasLanguage())) { - renderStatus(c.getDisplayElement(), td).addText(c.getDisplay()); - } else { - for (ConceptDefinitionDesignationComponent cd : c.getDesignation()) { - if (cd.getUse().is("http://terminology.hl7.org/CodeSystem/designation-usage", "display") && cd.hasLanguage() && cd.getLanguage().equals(getContext().getLang())) { - td.addText(cd.getValue()); - } - } - } + } + for (ConceptDefinitionDesignationComponent cd : c.getDesignation()) { + if (cd.hasLanguage() && !langs.contains(cd.getLanguage()) && !c.getDefinition().equalsIgnoreCase(cd.getValue())) { + list.add(new Translateable(cd.getLanguage(), cd.getValueElement())); + } + } + + if (getContext().getMultiLanguagePolicy() == MultiLanguagePolicy.NONE || list.size() <= 1) { + renderStatus(disp, td).addText(disp.asStringValue()); + } else { + boolean first = true; + for (Translateable ti : list) { + if (first) { + first = false; + } else { + td.br(); + } + + if (ti.lang != null) { + td.addText(ti.lang + ": "); + } + renderStatus(ti.getValue(), td).addText(ti.getValue().asStringValue()); + } + + } } + return hasExtensions; } private String getCodingReference(Coding cc, String system) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java index 6ca95f97b..1781220d2 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/DataRenderer.java @@ -1422,14 +1422,16 @@ public class DataRenderer extends Renderer implements CodeResolver { if (x.getName().equals("blockquote")) { x = x.para(); } - Currency c = Currency.getInstance(money.getCurrency()); + Currency c = money.hasCurrency() ? Currency.getInstance(money.getCurrency()) : null; if (c != null) { XhtmlNode s = x.span(null, c.getDisplayName()); s.tx(c.getSymbol(context.getLocale())); s.tx(getLocalizedBigDecimalValue(money.getValue(), c)); x.tx(" ("+c.getCurrencyCode()+")"); } else { - x.tx(money.getCurrency()); + if (money.getCurrency() != null) { + x.tx(money.getCurrency()); + } x.tx(money.getValue().toPlainString()); } } diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ParametersRenderer.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ParametersRenderer.java index 5cf21fd0d..485b681e2 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ParametersRenderer.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/ParametersRenderer.java @@ -84,6 +84,7 @@ public class ParametersRenderer extends ResourceRenderer { XhtmlNode para = td.para(); para.tx(rw.fhirType()+"/"+rw.getId()); para.an(rw.fhirType()+"_"+rw.getId()).tx(" "); + para.an("hc"+rw.fhirType()+"_"+rw.getId()).tx(" "); XhtmlNode x = rw.getNarrative(); if (x != null) { td.addChildren(x); @@ -123,6 +124,7 @@ public class ParametersRenderer extends ResourceRenderer { XhtmlNode para = td.para(); para.tx(r.fhirType()+"/"+r.getId()); para.an(r.fhirType()+"_"+r.getId()).tx(" "); + para.an("hc"+r.fhirType()+"_"+r.getId()).tx(" "); ResourceRenderer rr = RendererFactory.factory(r, context); rr.render(td, r); } else if (p.hasPart()) { diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java index 9dcc1ae7b..b9ecdd469 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/renderers/utils/RenderingContext.java @@ -902,5 +902,15 @@ public class RenderingContext extends RenderingI18nContext { } return e.primitiveValue(); } + + public RenderingContext withLocale(Locale locale) { + setLocale(locale); + return this; + } + + public RenderingContext withLocaleCode(String locale) { + setLocale(new Locale(locale)); + return this; + } } \ No newline at end of file diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/LocaleTests.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/LocaleTests.java new file mode 100644 index 000000000..6dfc3d10b --- /dev/null +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/LocaleTests.java @@ -0,0 +1,27 @@ +package org.hl7.fhir.utilities.i18n; + +import java.util.Locale; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LocaleTests { + + @Test + public void testSimple() { + Locale l = new Locale("en"); + Assertions.assertEquals("en", l.getLanguage()); + } + + @Test + public void testSimple2() { + Locale l = new Locale("*"); + Assertions.assertEquals("*", l.getLanguage()); + } + + @Test + public void testSimpleX() { + Locale l = new Locale("xx"); + Assertions.assertEquals("xx", l.getLanguage()); + } +} diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/comparison/tests/ComparisonTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/comparison/tests/ComparisonTests.java index 659c35cd0..8afdaaa93 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/comparison/tests/ComparisonTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/comparison/tests/ComparisonTests.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.stream.Stream; @@ -158,7 +159,7 @@ public class ComparisonTests { if (content.has("version")) { session.setAnnotate(true); } - RenderingContext lrc = new RenderingContext(context, new MarkDownProcessor(Dialect.COMMON_MARK), null, "http://hl7.org/fhir", "", "en", ResourceRendererMode.TECHNICAL, GenerationRules.IG_PUBLISHER); + RenderingContext lrc = new RenderingContext(context, new MarkDownProcessor(Dialect.COMMON_MARK), null, "http://hl7.org/fhir", "", new Locale("en"), ResourceRendererMode.TECHNICAL, GenerationRules.IG_PUBLISHER); lrc.setDestDir(Utilities.path("[tmp]", "comparison")); lrc.setPkp(new TestProfileKnowledgeProvider(context)); if (content.has("version")) {