{"id":1671,"date":"2026-08-28T16:43:23","date_gmt":"2026-08-28T14:43:23","guid":{"rendered":"https:\/\/www.flip-design.de\/?p=1671"},"modified":"2026-08-28T16:43:23","modified_gmt":"2026-08-28T14:43:23","slug":"translating-power-bi-semantic-models-with-powershell","status":"publish","type":"post","link":"https:\/\/www.flip-design.de\/?p=1671","title":{"rendered":"<strong>Translating Power BI Semantic Models with PowerShell<\/strong>"},"content":{"rendered":"\n<p>Power BI reports are typically developed using metadata in a single language. This means that table and column names, as well as measures and hierarchies, are defined in one language. For example, when I develop a report or semantic model in Germany, German is usually the preferred language. However, if someone from Denmark accesses the report, the visuals may be difficult for them to understand.<\/p>\n\n\n\n<p>Of course, I am not referring to the translation of transactional data or dimension values, but only to the technical metadata. The translation of the actual data must be handled in the source system or data warehouse.<\/p>\n\n\n\n<p>For this solution, I deliberately chose to use PowerShell 7 with a local Power BI Desktop file. If the semantic model is hosted in Microsoft Fabric, the translations can also be applied through the XMLA endpoint. In my opinion, however, this approach is slightly more complex.<\/p>\n\n\n\n<p>As preparation, I opened the report in Power BI Desktop. Because an Analysis Services instance runs in the background, I need to determine the port used by that instance. There are several ways to identify the port, but I developed the following PowerShell script for this purpose:<\/p>\n\n\n\n<p>getPort.ps1<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/philipplenz\/PowerBISemanticModelTranslation\/tree\/main\/Code\">https:\/\/github.com\/philipplenz\/PowerBISemanticModelTranslation\/tree\/main\/Code<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-14.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"529\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-14.png\" alt=\"\" class=\"wp-image-1672\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-14.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-14-300x169.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-14-768x432.png 768w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p>You need to keep this port number for the current session. However, the port changes whenever the report is reopened.<\/p>\n\n\n\n<p>I then developed another PowerShell tool that exports all relevant metadata to a CSV file.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/philipplenz\/PowerBISemanticModelTranslation\">https:\/\/github.com\/philipplenz\/PowerBISemanticModelTranslation<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-15.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"377\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-15.png\" alt=\"\" class=\"wp-image-1673\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-15.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-15-300x120.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-15-768x308.png 768w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p><em>In this screenshot, I started the PowerShell script without specifying a port. The script can automatically detect open semantic models. However, if several models are open or being developed at the same time, this can sometimes be misleading. The script therefore allows you to specify the port, the location to which the CSV file should be exported, and the language in which the model was originally developed.<\/em><\/p>\n\n\n\n<p><em>The exported CSV file can then be translated into the target language, for example by the relevant business department. Afterward, run the PowerShell script again and specify the translated CSV file to be imported, the port, and the target language.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-16.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"377\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-16.png\" alt=\"\" class=\"wp-image-1674\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-16.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-16-300x120.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-16-768x308.png 768w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p><em>The translations are then imported into the semantic model using the Tabular Object Model (TOM). You can verify the imported translations with Tabular Editor. Although translations can also be maintained directly in Tabular Editor, I believe this approach is too complex for business users:<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"591\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17.png\" alt=\"\" class=\"wp-image-1675\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17-300x189.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17-768x483.png 768w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-17-325x205.png 325w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p><em>I then published the report to the Power BI service. In my opinion, this is the easiest way to test the different languages. You can also change the language in Power BI Desktop, but this requires restarting the application and can make navigating the report more difficult.<\/em><\/p>\n\n\n\n<p><a href=\"https:\/\/app.powerbi.com\/groups\/me\/reports\/65ffccb3-dc6c-4abb-8ab4-9afcf1e43358\/ReportSection479333ec676b70c51208?experience=power-bi&amp;language=de-DE\">https:\/\/app.powerbi.com\/groups\/me\/reports\/65ffccb3-dc6c-4abb-8ab4-9afcf1e43358\/ReportSection479333ec676b70c51208?experience=power-bi&amp;language=de-DE<\/a><\/p>\n\n\n\n<p><em>The desired language can be passed and tested using the language URL parameter. In this example, language=de-DE displays the report in German.<\/em><\/p>\n\n\n\n<p><em>Without a translation, the report would be displayed as follows:<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-18.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"463\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-18.png\" alt=\"\" class=\"wp-image-1676\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-18.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-18-300x148.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-18-768x378.png 768w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p><em>The report would be displayed in German as follows:<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-19.png\"><img decoding=\"async\" loading=\"lazy\" width=\"940\" height=\"463\" src=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-19.png\" alt=\"\" class=\"wp-image-1677\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-19.png 940w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-19-300x148.png 300w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2026\/08\/image-19-768x378.png 768w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><\/a><\/figure>\n\n\n\n<p><strong>Conclusion<\/strong><\/p>\n\n\n\n<p>Using PowerShell and TOM, translations can be added to a Power BI semantic model easily. The business department can then maintain these translations quickly and conveniently using a familiar tool such as Excel.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Power BI reports are typically developed using metadata in a single language. This means that table and column names, as well as measures and hierarchies, are defined in one language. For example, when I develop a report or semantic model &hellip; <a href=\"https:\/\/www.flip-design.de\/?p=1671\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/1671"}],"collection":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1671"}],"version-history":[{"count":1,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/1671\/revisions"}],"predecessor-version":[{"id":1678,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/1671\/revisions\/1678"}],"wp:attachment":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}