<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://blog.icefire.ca/blogs/tag/microsoft/feed" rel="self" type="application/rss+xml"/><title>The PointFire Blog - The PointFire Blog for Multilingual SharePoint #Microsoft</title><description>The PointFire Blog - The PointFire Blog for Multilingual SharePoint #Microsoft</description><link>https://blog.icefire.ca/blogs/tag/microsoft</link><lastBuildDate>Sun, 13 Jul 2025 17:51:36 -0700</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[Localize your SPFx solutions with PointFire Localizer]]></title><link>https://blog.icefire.ca/blogs/post/localize-your-spfx-solutions-with-pointfire-localizer1</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/PointFire-Localizer-Github-SPFx.png"/>Managing multilingual SharePoint Framework (SPFx) solutions? We just released a new open-source project on Github: PointFire Localizer. It's a GitHub action that helps you translate your localization files for your SPFx solutions.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_CKS1HxPaRzq2qfGHf45Iuw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_WmLYjZJARU6YPMa-rCDVMg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_ItIxS8-iT9GmtujFJtfw3A" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"> [data-element-id="elm_ItIxS8-iT9GmtujFJtfw3A"].zpelem-col{ border-radius:1px; } </style><div data-element-id="elm_5uZQgTfFS1e8j-O3TyoeMQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_5uZQgTfFS1e8j-O3TyoeMQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">Managing multilingual SharePoint Framework (SPFx) solutions can get tricky as you need to ensure all translations are in place and take care of localization files from languages you need help understanding yourself. This was a problem we faced when developing our products.</span></p><p style="text-align:left;"><span style="font-size:16px;">&nbsp;</span></p><p style="text-align:left;"><span style="font-size:16px;">To be sure we always included all localization key/value pairs in our releases, we created some scripts that were only internally used.</span></p><p style="text-align:left;"><span style="font-size:16px;">&nbsp;</span></p><p style="text-align:left;"><span>We decided to make those scripts available to the community for free so you can also benefit from them. That is why we created a new open-source project called <a href="https://github.com/IceFireStudios/pointfire-localizer-action" rel="">PointFire Localizer</a>. This project is a GitHub Action that helps you translate your localization files for your SPFx solutions.</span></p><p style="text-align:left;"><span><br></span></p></div></div></div>
</div><div data-element-id="elm_q1_D6Xd7af1K2TdiStlVUg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_q1_D6Xd7af1K2TdiStlVUg"] .zpimage-container figure img { width: 500px ; height: 215.71px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_q1_D6Xd7af1K2TdiStlVUg"] .zpimage-container figure img { width:500px ; height:215.71px ; } } @media (max-width: 767px) { [data-element-id="elm_q1_D6Xd7af1K2TdiStlVUg"] .zpimage-container figure img { width:500px ; height:215.71px ; } } [data-element-id="elm_q1_D6Xd7af1K2TdiStlVUg"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-medium zpimage-tablet-fallback-medium zpimage-mobile-fallback-medium hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/PointFire-Localizer-Github-SPFx.png" width="500" height="215.71" loading="lazy" size="medium" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_90MfQuymlvrY4hZON5QPTg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_90MfQuymlvrY4hZON5QPTg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><br></p><p>This article shows you how to use PointFire Localizer to localize your SPFx solutions.</p><div style="color:inherit;"><div style="text-align:center;"></div></div></div></div></div>
</div><div data-element-id="elm_RASCClQeakuOpvr9QWcegw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_RASCClQeakuOpvr9QWcegw"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h2><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:700;color:rgb(11, 27, 45);">Maintaining localization files</span></h2></div></h2></div>
<div data-element-id="elm_cvFEU8C9jlVE9sKQz5pbXg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_cvFEU8C9jlVE9sKQz5pbXg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;">Every SPFx component has its own localization folder (`loc`) which contains a `en-us.js` and `myStrings.d.ts` file. There are ways to simplify this, like using a <a href="https://www.eliostruyf.com/simplify-localization-in-sharepoint-framework-projects/">single localization file</a> for all components, but eventually, you still must maintain all the key/value pairs for all languages.</span></p><p><span style="font-size:16px;"><br></span></p><div style="color:inherit;"><div style="text-align:center;"><span style="font-style:italic;">You can read more about simplifying localization in SPFx projects in the following&nbsp;article:&nbsp;</span></div><div style="text-align:center;"><div><span style="font-style:italic;"><a href="https://www.eliostruyf.com/simplify-localization-in-sharepoint-framework-projects/" rel="">Simplify localization in SharePoint Framework projects · Elio Struyf</a></span></div></div></div><p><span style="font-size:16px;">&nbsp;</span></p><p><span style="font-size:16px;">For instance, starting with a new SPFx project will get a `loc` folder with the `en-us.js` and `myStrings.d.ts` files. If you want to add French, you must create a `fr-fr.js` localization file and include the same key/value pairs as in the `en-us.js` file.</span></p><p><span style="font-size:16px;"><br></span></p><div style="color:inherit;"><div>```javascript</div><div>define([], function() {</div><div>return {</div><div>&amp;quot;PropertyPaneDescription&amp;quot;: &amp;quot;Description&amp;quot;,</div><div>&amp;quot;BasicGroupName&amp;quot;: &amp;quot;Group Name&amp;quot;,</div><div>&amp;quot;DescriptionFieldLabel&amp;quot;: &amp;quot;Description Field&amp;quot;</div><div>}</div><div>});</div><div>```</div></div></div></div></div>
</div><div data-element-id="elm_iphr8pGoA2AIItCzHjGQ_Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_iphr8pGoA2AIItCzHjGQ_Q"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><br></p><p>The tricky part is that you need to keep all those files in sync, so it gets more complicated with the more languages you need to support. Our PointFire Localizer solution helps you localize your SPFx solution, so you do not have to worry about missing translations.</p></div></div>
</div><div data-element-id="elm_0rwyW5k0svX5PtcETZpU6A" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_0rwyW5k0svX5PtcETZpU6A"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><h2><span style="font-size:20px;font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);">What is PointFire Localizer?</span></h2></div><div style="color:inherit;"><div></div></div></div></h2></div>
<div data-element-id="elm_dvbeYPBvGuniaypkVdMPkQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_dvbeYPBvGuniaypkVdMPkQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">PointFire Localizer is a GitHub Action that helps you translate your localization files for your SPFx solutions. The <a href="https://azure.microsoft.com/en-us/products/ai-services/ai-translator">Azure AI Translator</a> is used to translate your localization files to the desired languages.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">The GitHub Action adds the missing translations to your localization files so you can be sure that all key/value pairs are included in all languages. When a human has already translated a key, it will not be overwritten by machine translation. The GitHub Action favors human translations.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">Our GitHub Action is designed to be easily integrated into your existing build pipeline. Thus, you can automatically translate your localization files when you build your SPFx solution.</p></div></div>
</div><div data-element-id="elm_jluHSUVebuErv8KSIsCrKQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_jluHSUVebuErv8KSIsCrKQ"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><h2><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:700;color:rgb(11, 27, 45);">How to use PointFire Localizer?</span></h2></h2></div>
<div data-element-id="elm_gGf9h19PtpJz9tKchck2sw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_gGf9h19PtpJz9tKchck2sw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">As our builds are already running on GitHub Actions, we created a GitHub Action that can be used in your workflows. This way, you can easily integrate the localization process into your existing build pipeline, and you are sure that on release, all localization files will include all key/value pairs for all languages.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">Here you can see an example of a GitHub Actions workflow for packaging a SharePoint Framework solution:</p><p style="font-size:12pt;"><br></p><div style="color:inherit;"><span style="color:inherit;"><p><span style="font-size:12pt;">```yaml</span></p><p><span style="font-size:12pt;">name: Build</span></p><br><p><span style="font-size:12pt;">on:</span></p><p><span style="font-size:12pt;">&nbsp;push:</span></p><p><span style="font-size:12pt;">&nbsp;branches:</span></p><p><span style="font-size:12pt;">&nbsp;- dev</span></p><p><span style="font-size:12pt;">&nbsp;- main</span></p><p><span style="font-size:12pt;">&nbsp;workflow_dispatch:</span></p><br><p><span style="font-size:12pt;">jobs:</span></p><p><span style="font-size:12pt;">&nbsp;build:</span></p><p><span style="font-size:12pt;">&nbsp;runs-on: ubuntu-latest</span></p><p><span style="font-size:12pt;">&nbsp;steps:</span></p><p><span style="font-size:12pt;">&nbsp;- uses: actions/checkout@v4</span></p><br><p><span style="font-size:12pt;">&nbsp;- uses: actions/setup-node@v4</span></p><p><span style="font-size:12pt;">&nbsp;with:</span></p><p><span style="font-size:12pt;">&nbsp;node-version: 18</span></p><p><span style="font-size:12pt;">&nbsp;cache: 'npm'</span></p><br><p><span style="font-size:12pt;">&nbsp;- name: Install dependencies</span></p><p><span style="font-size:12pt;">&nbsp;run: npm ci</span></p><br><p><span style="font-size:12pt;">&nbsp;- name: Package solution</span></p><p><span style="font-size:12pt;">&nbsp;run: gulp bundle --ship &amp;&amp; gulp package-solution --ship</span></p><br><p><span style="font-size:12pt;">&nbsp;- name: Upload sppkg</span></p><p><span style="font-size:12pt;">&nbsp;uses: actions/upload-artifact@v4</span></p><p><span style="font-size:12pt;">&nbsp;with:</span></p><p><span style="font-size:12pt;">&nbsp;name: spfx-solution</span></p><p><span style="font-size:12pt;">&nbsp;path: ./**/sharepoint/solution/*.sppkg</span></p><p><span style="font-size:12pt;">```</span></p></span></div><p style="font-size:12pt;">&nbsp;</p></div></div>
</div><div data-element-id="elm_bDZ8NwlpAtC5TNWq6F0PxA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_bDZ8NwlpAtC5TNWq6F0PxA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><h3><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:700;color:rgb(11, 27, 45);">Add the Azure AI Translator API key to your GitHub repository</span></h3></h2></div>
<div data-element-id="elm_koTHOiZkoc1wxFVsRmdR7A" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_koTHOiZkoc1wxFVsRmdR7A"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">The prerequisite for using PointFire Localizer is that you have an Azure AI Translator service. You can create a new service in the Azure Portal. Once you have created the service, either the free or the paid tier, you can get the API key from the Azure Portal. You can find more information in the <a href="https://learn.microsoft.com/en-us/azure/ai-services/translator/create-translator-resource#get-your-authentication-keys-and-endpoint">get your authentication keys and endpoint</a> article.</p><p style="font-size:12pt;"><br></p><p style="font-size:12pt;"><span style="font-style:italic;"><span style="color:inherit;">You can make use of the free tier from Azure AI Translator.</span><br></span></p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">Follow the next steps to add your Azure AI Translator API key to your GitHub repository:</p><ul><li>Go to your GitHub repository</li><li>Go to the `Settings` tab</li><li>Go to the `Secrets and variables` section and click on `Actions`</li><li>Click on the `New repository secret` button</li><li>Add a new secret with the name `TRANSLATOR_API_KEY` and the value of your Azure AI Translator API key</li></ul><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">Once you have added the Azure AI Translator API key to your GitHub repository, you can add the PointFire Localizer GitHub Action to your workflow.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">There are two ways how you can use PointFire Localizer in your workflow:</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">1.<span style="font-size:7pt;">&nbsp; </span>By a predefined list of locales</p><p style="font-size:12pt;">2.<span style="font-size:7pt;">&nbsp; </span>By automatically detecting the locales</p></div></div>
</div><div data-element-id="elm_hIRUy9IXePFBxwfAffJYHQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_hIRUy9IXePFBxwfAffJYHQ"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><h3><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:700;color:rgb(11, 27, 45);">Using a predefined list of locales</span></h3></h2></div>
<div data-element-id="elm_iPvd8Oo5jM1SNeU3D3h3GQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_iPvd8Oo5jM1SNeU3D3h3GQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">If you want to use a predefined list of locales, you can add the following step to your workflow file right after the `install dependencies` step:</p><p style="font-size:12pt;"><br></p><p><span style="font-size:12pt;">```yaml</span></p><p><span style="font-size:12pt;">- name: PointFire Localizer</span></p><p><span style="font-size:12pt;">&nbsp;uses: IceFireStudios/pointfire-localizer-action@v1.0.0</span></p><p><span style="font-size:12pt;">&nbsp;with:</span></p><p><span style="font-size:12pt;">&nbsp;api-key: ${{ secrets.TRANSLATOR_API_KEY }}</span></p><p><span style="font-size:12pt;">&nbsp;api-region: &quot;westeurope&quot;</span></p><p><span style="font-size:12pt;">&nbsp;default-locale: &quot;en-us&quot;</span></p><p><span style="font-size:12pt;">&nbsp;locales: &quot;nl-nl,fr-fr,de-de&quot;</span></p><p><span style="font-size:12pt;">&nbsp;summary: true</span></p><p><span style="font-size:12pt;">```</span></p><p><span style="font-size:12pt;"><br></span></p></div></div>
</div><div data-element-id="elm_WQQSOVr23l3pakzs8glXEw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_WQQSOVr23l3pakzs8glXEw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">In this example, we use the predefined list of locales `nl-nl,fr-fr,de-de` and the default locale `en-us`.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">The GitHub Action will do the following:</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">·<span style="font-size:7pt;">&nbsp;</span>It will first look for all the `en-us.js` files in the SPFx solution</p><p style="font-size:12pt;">·<span style="font-size:7pt;">&nbsp;</span>It will then translate all the missing or empty key/value pairs to the locales `nl-nl`, `fr-fr`, and `de-de`</p><p style="font-size:12pt;">o<span style="font-size:7pt;">&nbsp;</span>If a localization file does not exist, it will create a new one</p><p style="font-size:12pt;">o<span style="font-size:7pt;">&nbsp;</span>If a localization file already exists, it will add the missing key/value pairs</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">The advantage of this approach is that those localization files can be created during the build process, so you do not have to make them manually if there are no human translations available.</p></div></div>
</div><div data-element-id="elm_tIua8ta12xrorHpa0mfC0Q" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_tIua8ta12xrorHpa0mfC0Q"] .zpimage-container figure img { width: 500px ; height: 261.56px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_tIua8ta12xrorHpa0mfC0Q"] .zpimage-container figure img { width:500px ; height:261.56px ; } } @media (max-width: 767px) { [data-element-id="elm_tIua8ta12xrorHpa0mfC0Q"] .zpimage-container figure img { width:500px ; height:261.56px ; } } [data-element-id="elm_tIua8ta12xrorHpa0mfC0Q"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-medium zpimage-tablet-fallback-medium zpimage-mobile-fallback-medium hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/PointFire-Localizer-Githib-Localization-Summary.png" width="500" height="261.56" loading="lazy" size="medium" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_8QlHmyMIB04pp6O7JRAHqg" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_8QlHmyMIB04pp6O7JRAHqg"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><h3><span style="font-size:20px;font-family:&quot;Work Sans&quot;;font-weight:700;color:rgb(11, 27, 45);">Automatically detecting the locales</span></h3></h2></div>
<div data-element-id="elm_uvEn1MpGi-9y44oI5n2kzQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_uvEn1MpGi-9y44oI5n2kzQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">If you want to detect the locales automatically, you can add the following step to your workflow file right after the `install dependencies` step:</p><p style="font-size:12pt;"><br></p><p><span style="font-size:12pt;">```yaml</span></p><p><span style="font-size:12pt;">- name: PointFire Localizer</span></p><p><span style="font-size:12pt;">&nbsp;uses: IceFireStudios/pointfire-localizer-action@v1.0.0</span></p><p><span style="font-size:12pt;">&nbsp;with:</span></p><p><span style="font-size:12pt;">&nbsp;api-key: ${{ secrets.TRANSLATOR_API_KEY }}</span></p><p><span style="font-size:12pt;">&nbsp;api-region: &quot;westeurope&quot;</span></p><p><span style="font-size:12pt;">&nbsp;default-locale: &quot;en-us&quot;</span></p><p><span style="font-size:12pt;">&nbsp;summary: true</span></p><p><span style="font-size:12pt;">```</span></p><p style="font-size:12pt;"><span style="color:inherit;"></span></p><div><span style="font-size:12pt;"><br></span></div></div></div>
</div><div data-element-id="elm_cPWaOlFiUIKFSEPotrBrcg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_cPWaOlFiUIKFSEPotrBrcg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:12pt;">In this example, we are using the default locale `en-us`. As we did not specify any locales, the GitHub Action will automatically detect them based on the existing localization files.</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">The GitHub Action will do the following:</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">·<span style="font-size:7pt;">&nbsp;</span>It will first look for all the `en-us.js` files in the SPFx solution</p><p style="font-size:12pt;">·<span style="font-size:7pt;">&nbsp;</span>It will retrieve the linked locales per the default locale</p><p style="font-size:12pt;">·<span style="font-size:7pt;">&nbsp;</span>It will then translate all the missing or empty key/value pairs to the linked locales</p><p style="font-size:12pt;">&nbsp;</p><p style="font-size:12pt;">In this case, the GitHub Action will only translate the existing locale files in the SPFx solution.</p></div></div>
</div><div data-element-id="elm_cblqxh7jiVu4GYOm1LWGzQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_cblqxh7jiVu4GYOm1LWGzQ"] .zpimage-container figure img { width: 500px ; height: 261.56px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_cblqxh7jiVu4GYOm1LWGzQ"] .zpimage-container figure img { width:500px ; height:261.56px ; } } @media (max-width: 767px) { [data-element-id="elm_cblqxh7jiVu4GYOm1LWGzQ"] .zpimage-container figure img { width:500px ; height:261.56px ; } } [data-element-id="elm_cblqxh7jiVu4GYOm1LWGzQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-medium zpimage-tablet-fallback-medium zpimage-mobile-fallback-medium hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/PointFire-Localizer-Githib-Localization-Summary-2.png" width="500" height="261.56" loading="lazy" size="medium" data-lightbox="true"/></picture></span></figure></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Mon, 25 Mar 2024 15:02:44 -0400</pubDate></item><item><title><![CDATA[Is GPT better at translating than translation engines?]]></title><link>https://blog.icefire.ca/blogs/post/is-gpt-better-at-translating-than-translation-engines</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/languages.png"/>Generative Pre-trained Transformer (GPT) systems are not designed to be translation engines. So it is surprising that they succeed so well at doing simple translations. Some articles have claimed that they can translate better than existing translation engines. How true are those claims?]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_tDbLseMrQ1atvh_reNkSWg" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_UVV3AohDQdGTvwDADeeliw" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"> [data-element-id="elm_UVV3AohDQdGTvwDADeeliw"].zprow{ border-radius:1px; } </style><div data-element-id="elm_BTUzPodyT4CO85UyifeZEA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"> [data-element-id="elm_BTUzPodyT4CO85UyifeZEA"].zpelem-col{ border-radius:1px; } </style><div data-element-id="elm_f3ptpRwjce2pziid40quFg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_f3ptpRwjce2pziid40quFg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Generative Pre-trained Transformer (GPT) systems are not designed to be translation engines.&nbsp; So it is surprising that they succeed so well at doing simple translations.&nbsp; Some articles have claimed that they can translate better than existing translation engines.&nbsp; How true are those claims?</p></div></div>
</div><div data-element-id="elm_wwrYpJJnyynTEBW1VCGNaw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_wwrYpJJnyynTEBW1VCGNaw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;">Most of those claims are based on testing with a few sentences chosen by the author, few language pairs, and a qualitative scoring of how good the translation is.&nbsp; However, more systematic evaluations with large samples of more types of text, more languages, and more objective quality scoring by machines and humans tell a different story.</span><br></p></div>
</div><div data-element-id="elm_46LFSwHNzt6gdr8LjAh8NQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_46LFSwHNzt6gdr8LjAh8NQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>The best comprehensive evaluation was done by scientists at Microsoft Research, unsurprising because they are among the leaders in both machine translation and GPT models.&nbsp; The brief summary is that while GPT models have competitive quality when translating usual sentences from a major (see high-resource below) language to English, they are less good at other types of translation.</p></div></div>
</div><div data-element-id="elm_N7pEJJlKArL38OQeyi1R3Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_N7pEJJlKArL38OQeyi1R3Q"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>The evaluation uses three GPT systems that are known for translation quality, and compares them with neural machine translation engines (NMT), either Microsoft Azure API or the best-performing commercial systems or research prototype.&nbsp; Quality scoring uses either algorithmic scoring or human evaluation.</p></div></div>
</div><div data-element-id="elm_hPgLpVu7xvZTX8EVf8QoUg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_hPgLpVu7xvZTX8EVf8QoUg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><a href="https://arxiv.org/pdf/2302.09210.pdf" title="How Good Are GPT Models at Machine Translation? A Comprehensive Evaluation&nbsp;" rel="">How Good Are GPT Models at Machine Translation? A Comprehensive Evaluation</a>&nbsp;<br></p><div><br></div></div></div>
</div><div data-element-id="elm_ivvprsnnnhFmrXoNaiJMfw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_ivvprsnnnhFmrXoNaiJMfw"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><p>Languages and language direction</p></div></h3></div>
<div data-element-id="elm_OYh0FJo0e1jQwh74F41YlA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_OYh0FJo0e1jQwh74F41YlA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>In most languages and for language directions, MS Azure Translator and other NMT engines outperform GPT for most measures of quality.&nbsp; However, GPT does have the ability to improve after being given a few examples of correct translations, and to outperform NMT in some language directions after 5 tries.&nbsp; This is the case for translations to English from German, Chinese and Japanese, languages for which there are a lot of examples in the GPT training set.&nbsp; These are called “high-resource” languages.&nbsp; On the other hand, it does not do particularly well for low-resource languages like Czech or Icelandic, or for English to other languages.&nbsp; GPT’s training set had less text in those languages.&nbsp; In the chart below, orange is GPT and blue is NMT.&nbsp; The lines are algorithmic evaluation and the bars are human evaluation.</p></div></div>
</div><div data-element-id="elm_4GnKGtHJ6wbcwAK1NGEjCg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_4GnKGtHJ6wbcwAK1NGEjCg"] .zpimage-container figure img { width: 624px !important ; height: 398px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_4GnKGtHJ6wbcwAK1NGEjCg"] .zpimage-container figure img { width:624px ; height:398px ; } } @media (max-width: 767px) { [data-element-id="elm_4GnKGtHJ6wbcwAK1NGEjCg"] .zpimage-container figure img { width:624px ; height:398px ; } } [data-element-id="elm_4GnKGtHJ6wbcwAK1NGEjCg"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/languages.png" width="624" height="398" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Trbv_VsvOl0UReU8UqOXpA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_Trbv_VsvOl0UReU8UqOXpA"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><p>Sentence-level vs. multi-sentence</p></div></div></h3></div>
<div data-element-id="elm_4PSNPeNPm7jG976XCnkNSQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_4PSNPeNPm7jG976XCnkNSQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Those experiments above are for sentence-level translations.&nbsp; For multi-sentence translations, those with more context that can be found in other sentences, GPT improves relative to NMT.&nbsp; Not enough to beat the best NMT systems, but sometimes enough to match or beat the normal Azure API.&nbsp; That is not very surprising: Azure Translator was optimized for sentence-level translation, while GPT is trained for multi-sentence context, up to thousands of words.&nbsp; Other Azure translation APIs like Document Translator and Custom Translator are better at longer context windows, but this is not what was tested here.&nbsp;</p></div></div>
</div><div data-element-id="elm_13pYmoMB8Ri4gFMkS-ersw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_13pYmoMB8Ri4gFMkS-ersw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Neural Machine Translation models have another big advantage over GPT: they can be re-trained for a particular domain rather than with general domains, and this significantly improves their quality score for that domain.&nbsp; For example, by giving it many training examples of automotive documents, Azure Custom Translator (a re-trainable version of Azure Translator) can increase its translation quality for documents in the automotive domain by a large factor.</p></div></div>
</div><div data-element-id="elm_MiC-NQB9r4oyIjEzaBo6HQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_MiC-NQB9r4oyIjEzaBo6HQ"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><p>Fluency and alignment</p></div></div></h3></div>
<div data-element-id="elm_OnDZyqsMG88uqB5qjbGWOQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_OnDZyqsMG88uqB5qjbGWOQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Looking at other measures of performance gives a better understanding of what is different in the performance of the GPT vs. NMT.&nbsp; Measuring fluency, essentially how natural is the sentence, how similar it is to other sentences out in the world, tells you something about the quality of the prose.&nbsp; GPT is more fluent in English, it sounds more natural.&nbsp; That doesn’t mean that it is a more accurate translation, far from it.&nbsp; In fact, GPT has a greater tendency to add words, concepts, and punctuation that do not correspond to the original, or to omit some.&nbsp; So it’s good prose, but it’s not necessarily what the original said.&nbsp; For example, it does better at figures of speech, by not translating them literally, but also does not necessarily replace it with a term that means exactly the same thing.&nbsp; It does not wander far from the original with completely made-up things, but it’s often not quite correct.&nbsp; However GPT also does hallucinate words or concepts that were not in the original.<br></p><div><div style="color:inherit;"><p><br></p><p><a href="https://arxiv.org/abs/2305.16806" title="Do GPTs Produce Less Literal Translations?" rel="">Do GPTs Produce Less Literal Translations?</a>&nbsp;</p></div></div></div></div>
</div><div data-element-id="elm_em5DmpwzIvEOv7gi25W58w" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_em5DmpwzIvEOv7gi25W58w"] .zpimage-container figure img { width: 463px !important ; height: 127px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_em5DmpwzIvEOv7gi25W58w"] .zpimage-container figure img { width:463px ; height:127px ; } } @media (max-width: 767px) { [data-element-id="elm_em5DmpwzIvEOv7gi25W58w"] .zpimage-container figure img { width:463px ; height:127px ; } } [data-element-id="elm_em5DmpwzIvEOv7gi25W58w"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/idiom.png" width="463" height="127" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_xBGZxVb8PgHqZB19limLNw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_xBGZxVb8PgHqZB19limLNw"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><p>Translationese</p></div></div></h3></div>
<div data-element-id="elm_2e2-K-qRJowsZrrZcmfFOA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_2e2-K-qRJowsZrrZcmfFOA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>A literal and faithful translation is sometimes required, but that often leads to what is called “translationese”.&nbsp; This refers to a set of common issues with text generated by human translators.&nbsp; Translationese can refer to excessive precision or wordiness, or excessive vagueness in translated text, or syntax that is uncommon in the target language.&nbsp; What translators are compensating for is the fact that different languages are specific about different things.&nbsp; For example, English has the term “uncle”, which does not differentiate between paternal and maternal uncle or uncles by blood or marriage, but many other languages are much more specific.&nbsp; Translating from those other languages to English, Translationese would not say “uncle” but might say “maternal uncle by marriage”, a term that is unusual in English, but which avoids losing information that was contained in the original.&nbsp; In terms of translation quality, humans who are not translators might rate the translation with “uncle” higher because it sounds more natural, but translators would rate the awkward translation higher because it is more accurate.</p><p><br></p><p><span style="color:inherit;"><a href="https://arxiv.org/abs/2104.07623" title="Sometimes We Want Translationese" rel="">Sometimes We Want Translationese</a></span><br></p></div></div>
</div><div data-element-id="elm_1v3UqmUWI0PY_kDgHNpFEg" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_1v3UqmUWI0PY_kDgHNpFEg"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><p>Design and training of GPT and NMT</p></div></div></h3></div>
<div data-element-id="elm_TrxEYA97NeXggnNFOH0fDw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_TrxEYA97NeXggnNFOH0fDw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p>There are big differences between the texts used to train GPT engines and the texts used to train NMT engines.&nbsp; GPT engines are trained on unilingual text found on the internet, mostly in English.&nbsp; For any sequence of words, GPT learns the most likely next word.&nbsp; NMT engines are trained on curated professionally translated sentences, pairs of original sentences and their translations.&nbsp; For all the curation, these data sets are often noisy and include incorrect translations that set back the training.&nbsp; For any sentence within a document in the source language, NMT predicts the translated sentence.&nbsp; This is part of the reason why NMT learns to produce translationese and GPT does not: it’s in the training set.</p></div></div></div>
</div><div data-element-id="elm_C4pvHsnS1vHjjdqyrrTqOw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_C4pvHsnS1vHjjdqyrrTqOw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>The design of the two types of models is also different. The “T” in GPT stands for “Transformer”.&nbsp; Transformer is an attention-based neural network model that when looking at a word within a sentence or even longer text, determines which other words are the most relevant ones to pay attention to.&nbsp; NMT also uses Transformer models.&nbsp; However, there are big differences.&nbsp; One is that GPT uses Decoder models, while NMT uses Encoder-decoder models.&nbsp; What does that mean?&nbsp; Decoder models focus on the output, the next word to be spit out.&nbsp; Encoder-decoder models try to extract features from the input before feeding it to the part of the model that predicts the output.&nbsp; It focuses separately on the input and on the output.&nbsp; It tries to be robust to small changes in the input.</p></div></div>
</div><div data-element-id="elm_ZFFoET6GwZJ40lJm9kkBrA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ZFFoET6GwZJ40lJm9kkBrA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>GPT only outputs one word at a time.&nbsp; It starts with the text of the prompt plus other information in the input, then outputs a single word.&nbsp; Then it adds that word to the end of the prompt in the input and puts this new input through again to get the next word.&nbsp; It is unidirectional, that is to say when it is generating text it only looks at the previous words that are already generated, it doesn’t consider what it will say next because it hasn’t said it yet. Like a lot of humans, GPT is more concerned with what it wants to say next than with what you’re saying. &nbsp;NMT is bidirectional.&nbsp; It considers the rest of the sentence and the next sentence in both the source and the translation while it is generating the text.&nbsp; It generates entire sentences at once.</p></div></div>
</div><div data-element-id="elm_yIisgdweYhX48cbBcwa4wg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_yIisgdweYhX48cbBcwa4wg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Because it is a generative model, GPT is biased towards what is usual.&nbsp; If the original text in the other language is commonplace and expected, then GPT will find good ways to express that text in English in ways that are commonplace and expected, because that is what it is trained to do.&nbsp; If the original says something that is unexpected or expresses it in unexpected ways, GPT’s translation is likely to replace it with something more usual using some of the same words.&nbsp; GPT does well at translation essentially because most things that require translation are predictable and unoriginal.</p></div></div>
</div><div data-element-id="elm_XU06fCYNGFWKXyoER9rTUw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_XU06fCYNGFWKXyoER9rTUw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>NMTs have a whole bag of tricks to deal with translation tasks that GPT does not, including specialized knowledge about the structure of languages, and tricks to deal with numbers, capitalization, and non-standard spacing correctly and efficiently.&nbsp; They are also trained to preserve information.&nbsp; You know that trick that people sometimes use, translating a sentence to another language then back to English so they can laugh at the result?&nbsp; NMTs include that round-trip in their training, to make sure that none of the meaning gets lost in the translation.&nbsp; Other tricks include having the neural network teach another neural network how to translate, detecting errors in the training data, and other tricks that address common translation errors.&nbsp; There are also tricks to reduce gender bias, a problem that still plagues GPT.</p></div></div>
</div><div data-element-id="elm_36dwuF6_ONEOJ5UGuuNZhw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_36dwuF6_ONEOJ5UGuuNZhw"].zpelem-heading { border-radius:1px; } </style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><div><p>Computing power required</p></div></div></div></h3></div>
<div data-element-id="elm_968TT3XKXbL3DR-Ht9w_3g" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_968TT3XKXbL3DR-Ht9w_3g"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>Current Azure Translator NMT uses models of about 50 million parameters, which can run 4 language pairs in a Docker container on a host having a 2-core CPU with 2 GB memory.&nbsp; Even the next generation of NMTs, <a href="https://blog.icefire.ca/blogs/post/how-to-get-a-higher-level-of-machine-translation-quality" title="Z-code MoE" rel="">Z-code MoE</a>, which have 100 languages (10,000 language pairs) in a single model, can fit on a single GPU even though they have billions or hundreds of billions of parameters.&nbsp; These are sizes for querying, what is required for training is much bigger.&nbsp; GPT-4 uses 100 trillion parameters.&nbsp; Training requires hundreds of thousands of CPUs and tens of thousands of GPUs, but to query them, it looks like a single cluster of 8 GPUs and a dozen or two CPUs is what is required.&nbsp; Microsoft is very good at shrinking by orders of magnitude the size of machines required to run AI models so direct comparison is difficult, but NMTs deliver translations at much lower computational cost.&nbsp; Microsoft’s DeepSpeed library in particular increases speed and reduces latency by a large factor.</p><p><br></p><p>The computing power required also has a potential impact on security.&nbsp; NMTs, even the bigger potential NMTs can be run on a single processor, while GPT requires many processors.&nbsp; Using GPT you are probably sharing hardware with strangers, while for NMT it is possible to have dedicated resources.&nbsp; Because of its recurrent architecture, where the output is fed back into the input, GPT probably has some static storage of your data, while NMT can be architected with a pipeline where neither the input nor output text is ever stored.&nbsp; I don't know how it is implemented by anyone, but I notice that for Azure, NMT has a no-trace option by default while GPT limited access previews do not.&nbsp; Because of ethical concerns, data is probably retained for abuse monitoring.&nbsp; I'm sure the security is good, but the architecture reduces the options for security.</p></div></div>
</div><div data-element-id="elm_azlB0lmtdPdOlibqoksLHQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_azlB0lmtdPdOlibqoksLHQ"] .zpimage-container figure img { width: 1110px ; height: 713.35px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_azlB0lmtdPdOlibqoksLHQ"] .zpimage-container figure img { width:723px ; height:464.64px ; } } @media (max-width: 767px) { [data-element-id="elm_azlB0lmtdPdOlibqoksLHQ"] .zpimage-container figure img { width:415px ; height:266.70px ; } } [data-element-id="elm_azlB0lmtdPdOlibqoksLHQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/performance.jpg" width="415" height="266.70" loading="lazy" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_DOtJj3rG9dVwXmZBaX0S3A" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_DOtJj3rG9dVwXmZBaX0S3A"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true">Conclusion</h2></div>
<div data-element-id="elm_XFr0lnW8TS4_CtxFNGC9gg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_XFr0lnW8TS4_CtxFNGC9gg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p>The blanket claim that GPT is better at translation in not generally true.&nbsp; However GPT is surprisingly good, considering that translation is a task that it was neither designed nor trained for.&nbsp; It is unexpected that it is sometimes equal to or better than the highly specialized NMTs.&nbsp; There is a fair bit of work being done on hybrid systems that combine the accuracy and specialized training of NMT with the fluency of GPT and will deliver the best of both. The next generation of NMT (see <span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/how-to-get-a-higher-level-of-machine-translation-quality" title="How to get a higher level of machine translation quality" rel="">How to get a higher level of machine translation quality</a></span><span style="color:inherit;">) will also allow the model to transfer language knowledge obtained from one language to other related languages, and in that way vastly improve the quality for low-resource languages such as southern Slavic languages.&nbsp; That innate knowledge of what is common to languages in the same family can then be used to improve the quality of both NMT and GPT.</span></p><div><br></div><div><div style="color:inherit;"><p><a href="https://arxiv.org/abs/2309.11674" title="A Paradigm Shift in Machine Translation: Boosting Translation Performance of Large Language Models" rel="">A Paradigm Shift in Machine Translation: Boosting Translation Performance of Large Language Models</a>&nbsp;<br></p><div><br></div></div></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 06 Oct 2023 09:30:00 -0400</pubDate></item><item><title><![CDATA[Trick to Uncripple Teams Private Channel Sites]]></title><link>https://blog.icefire.ca/blogs/post/trick-to-uncripple-teams-private-channel-sites</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/SharePoint-cant-add-app-PointFire-blog.png"/>Here is a trick that I never realized was not common knowledge. When you create a private channel in Teams, its SharePoint site can’t add certain apps, both custom apps and standard ones, including Calendar and Tasks.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_NcmVIDTBQXWi2cJY3wMk-Q" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_KUvcHjd-REuU1FyFUIBYYw" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_RecNDb8eS1G4l7knMS2MeQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_EHy8b2xOQXCtzJTvM0M5Vw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_EHy8b2xOQXCtzJTvM0M5Vw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">Here is a trick that I never realized was not common knowledge.&nbsp; When you create a private channel in Teams, its SharePoint site can’t add certain apps, both custom apps and standard ones, including Calendar and Tasks.</span></p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p><p style="text-align:left;"><span style="font-size:16px;">TLDR: Enable-PnPFeature 73EF14B1-13A9-416b-A9B5-ECECA2B0604C -Scope Site -Force</span></p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p><p style="text-align:left;"><span style="font-size:16px;">Now for the longer explanation.&nbsp; When you try to add an app to this type of site, you find very few options in Modern view.</span></p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p></div></div></div>
</div><div data-element-id="elm_lf5aKi2hoOPIh1gYnsuRqg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_lf5aKi2hoOPIh1gYnsuRqg"] .zpimage-container figure img { width: 1110px ; height: 526.61px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_lf5aKi2hoOPIh1gYnsuRqg"] .zpimage-container figure img { width:723px ; height:343.01px ; } } @media (max-width: 767px) { [data-element-id="elm_lf5aKi2hoOPIh1gYnsuRqg"] .zpimage-container figure img { width:415px ; height:196.89px ; } } [data-element-id="elm_lf5aKi2hoOPIh1gYnsuRqg"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-modern-view-PointFire-blog.png" width="415" height="196.89" loading="lazy" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_2OH8JyKl3Mp_NZ9-2y21JA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_2OH8JyKl3Mp_NZ9-2y21JA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><br></p><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;">Click on “classic experience” and you get a few more, but not nearly as many as you get for normal sites.</span></p><p style="font-size:11pt;"><br></p></div></div></div>
</div><div data-element-id="elm_HyMNuRaUC-DRKDbamQRsjQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_HyMNuRaUC-DRKDbamQRsjQ"] .zpimage-container figure img { width: 1110px ; height: 708.08px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_HyMNuRaUC-DRKDbamQRsjQ"] .zpimage-container figure img { width:723px ; height:461.21px ; } } @media (max-width: 767px) { [data-element-id="elm_HyMNuRaUC-DRKDbamQRsjQ"] .zpimage-container figure img { width:415px ; height:264.73px ; } } [data-element-id="elm_HyMNuRaUC-DRKDbamQRsjQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="center" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-classic-view-PointFire-blog.png" width="415" height="264.73" loading="lazy" size="fit" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_UG0gJDcZr6HFfH-RYKY51A" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_UG0gJDcZr6HFfH-RYKY51A"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><br></p><div style="color:inherit;"><p><span style="font-size:16px;">For some apps “From your organization”, particularly the ones using the Add-in model in my case, there are some “You can’t add this app here” messages.</span></p><p style="font-size:11pt;"><br></p></div></div>
</div><div data-element-id="elm_Bt2BZK1l9J_KQT1I28pWVw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_Bt2BZK1l9J_KQT1I28pWVw"] .zpimage-container figure img { width: 188px !important ; height: 212px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_Bt2BZK1l9J_KQT1I28pWVw"] .zpimage-container figure img { width:188px ; height:212px ; } } @media (max-width: 767px) { [data-element-id="elm_Bt2BZK1l9J_KQT1I28pWVw"] .zpimage-container figure img { width:188px ; height:212px ; } } [data-element-id="elm_Bt2BZK1l9J_KQT1I28pWVw"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-cant-add-app-PointFire-blog.png" width="188" height="212" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_A5hN2tbQKqs_NFmUKZ6PFQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_A5hN2tbQKqs_NFmUKZ6PFQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">Usually “Find out why” is not that helpful, but for one such app, it gives an actual reason</span></p><p><br></p></div></div>
</div><div data-element-id="elm_naxVafU-4TI_NBFngZzw2A" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_naxVafU-4TI_NBFngZzw2A"] .zpimage-container figure img { width: 424px !important ; height: 260px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_naxVafU-4TI_NBFngZzw2A"] .zpimage-container figure img { width:424px ; height:260px ; } } @media (max-width: 767px) { [data-element-id="elm_naxVafU-4TI_NBFngZzw2A"] .zpimage-container figure img { width:424px ; height:260px ; } } [data-element-id="elm_naxVafU-4TI_NBFngZzw2A"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-cant-add-app2-PointFire-blog.png" width="424" height="260" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_JDMp-10cKYpFz-KlQMylsg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_JDMp-10cKYpFz-KlQMylsg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">Something something taxonomy, yada yada.&nbsp; There are a couple of taxonomy-related hidden features on SharePoint sites.&nbsp; A little digging and it looks like feature with ID 73EF14B1-13A9-416b-A9B5-ECECA2B0604C is not enabled on Private Channel sites, but is enabled on other sites.&nbsp; Try this command to turn it back on:</span></p><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">Enable-PnPFeature 73EF14B1-13A9-416b-A9B5-ECECA2B0604C -Scope Site -Force</span></p><p><span style="font-size:16px;">That did it for me, suddenly there were 20 options of apps that could be added, including Calendar, Tasks, Promoted Links, Surveys, all the good classic SharePoint stuff, plus most of my custom apps.&nbsp; It works for me, it might work for you.</span></p><p><span style="font-size:16px;"><br></span></p><p>Did you find this article useful? Have questions? Let us know in the comments.</p><p style="font-size:11pt;"><br></p></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 27 Apr 2023 13:20:08 -0400</pubDate></item><item><title><![CDATA[Localizing "group by" headers for choice columns using JSON view formatting in SharePoint Online]]></title><link>https://blog.icefire.ca/blogs/post/localizing-group-by-headers-for-choice-columns-using-json-view-formatting</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/SharePoint-group-by-list.png"/>In previous posts, I’ve shown how Choice column values can be localized using a variety of techniques in JSON column formatting, most notably by using the “@UIlcid” token. Can these techniques also be used when doing “group by” these choice columns? Let's find out]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_8Hi9fVIMRPy3Dbr7T70kFQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_trb5cnV-TK-bwzsxa1zMhQ" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_cgjCOgfjRdSH7sSKTMofcg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_N2N7e5Q4QWS0SPMHavxDzQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_N2N7e5Q4QWS0SPMHavxDzQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p style="text-align:left;"><a href="https://blog.icefire.ca/blogs/post/language-dependent-json-column-formatting-this-time-it-s-the-uilcid-token" title="In previous posts" rel="">I</a><a href="https://blog.icefire.ca/blogs/post/language-dependent-json-column-formatting-this-time-it-s-the-uilcid-token" title="In previous posts" rel="">n previous posts</a>, I’ve shown how Choice column values can be localized using a variety of techniques in JSON column formatting, most notably by using the “@UIlcid” token.</p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p><p style="text-align:left;"><span style="font-size:16px;">Can these techniques also be used when doing “group by” these choice columns?&nbsp; The short answer is no. &nbsp;But fear not, a design decision in SharePoint that normally breaks localization can be used to enable localization.</span></p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p><p style="text-align:left;"><span style="font-size:16px;">Let’s have a look at what happens when we see a list that is “grouped by” a choice column.&nbsp; Here it is in English, grouped by “progress”:</span></p><p style="text-align:left;"><span style="font-size:16px;"><br></span></p></div></div></div>
</div><div data-element-id="elm_xgFvJtzhINNQQGDYZ0HLIQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_xgFvJtzhINNQQGDYZ0HLIQ"] .zpimage-container figure img { width: 939px !important ; height: 274px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_xgFvJtzhINNQQGDYZ0HLIQ"] .zpimage-container figure img { width:939px ; height:274px ; } } @media (max-width: 767px) { [data-element-id="elm_xgFvJtzhINNQQGDYZ0HLIQ"] .zpimage-container figure img { width:939px ; height:274px ; } } [data-element-id="elm_xgFvJtzhINNQQGDYZ0HLIQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-group-by-list-1.png" width="939" height="274" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_gB8t60afrizuegagyVWwNw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_gB8t60afrizuegagyVWwNw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><br></p><p>We have applied the technique from the <a href="https://blog.icefire.ca/blogs/post/language-dependent-json-column-formatting-this-time-it-s-the-uilcid-token" target="_blank" rel="">Language-dependent JSON column formatting</a> blog post so that the choice column values are localized into French and German.&nbsp; However as we can see below, this does not extend to the “group by” headers, those remain in English.&nbsp; The column value, in blue, is localized, but the same value in the header is not.</p><p><br></p></div></div>
</div><div data-element-id="elm_HTbeLRkTlKbZGCyikmquaQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_HTbeLRkTlKbZGCyikmquaQ"] .zpimage-container figure img { width: 930px !important ; height: 274px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_HTbeLRkTlKbZGCyikmquaQ"] .zpimage-container figure img { width:930px ; height:274px ; } } @media (max-width: 767px) { [data-element-id="elm_HTbeLRkTlKbZGCyikmquaQ"] .zpimage-container figure img { width:930px ; height:274px ; } } [data-element-id="elm_HTbeLRkTlKbZGCyikmquaQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-group-by-list-2.png" width="930" height="274" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_v1VTCDF-2BjGCou1WWf4JQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_v1VTCDF-2BjGCou1WWf4JQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">The display of values in the columns can be customized by <u>column</u> formatting JSON, but display of values in the group-by headers must be customized by <u>view</u> formatting JSON.&nbsp; Let’s have a look at how we can change that formatting.&nbsp; In the View menu, we can find “Format current view” in the bottom.&nbsp; In this case we are going to format the AllItems (default) list view.</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_EtrHntJXQjsva6_ZgJxznQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_EtrHntJXQjsva6_ZgJxznQ"] .zpimage-container figure img { width: 392px ; height: 500.00px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_EtrHntJXQjsva6_ZgJxznQ"] .zpimage-container figure img { width:392px ; height:500.00px ; } } @media (max-width: 767px) { [data-element-id="elm_EtrHntJXQjsva6_ZgJxznQ"] .zpimage-container figure img { width:392px ; height:500.00px ; } } [data-element-id="elm_EtrHntJXQjsva6_ZgJxznQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-medium zpimage-tablet-fallback-medium zpimage-mobile-fallback-medium hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-all-item-column-list-view.png" width="392" height="500.00" loading="lazy" size="medium" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_WjlFIifaH4mZT_ZZh8H6mg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_WjlFIifaH4mZT_ZZh8H6mg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">By default it offers the graphical “design mode”.</span></p></div></div>
</div><div data-element-id="elm_rsFaz4wvHvffqKbNFQ0ZHA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_rsFaz4wvHvffqKbNFQ0ZHA"] .zpimage-container figure img { width: 624px ; height: 760.00px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_rsFaz4wvHvffqKbNFQ0ZHA"] .zpimage-container figure img { width:500px ; height:608.97px ; } } @media (max-width: 767px) { [data-element-id="elm_rsFaz4wvHvffqKbNFQ0ZHA"] .zpimage-container figure img { width:500px ; height:608.97px ; } } [data-element-id="elm_rsFaz4wvHvffqKbNFQ0ZHA"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-large zpimage-tablet-fallback-large zpimage-mobile-fallback-large hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-List-Format-view.png" width="500" height="608.97" loading="lazy" size="large" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_aHtGg_JUoG80LF7XPUEC-Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_aHtGg_JUoG80LF7XPUEC-Q"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">Let’s select “Advanced mode” to see the JSON.&nbsp; It is initially empty other than the schema declaration, so it uses some default formatting.</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_4V-igUMwiOJko8r83KxGXQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_4V-igUMwiOJko8r83KxGXQ"] .zpimage-container figure img { width: 500px ; height: 610.58px ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_4V-igUMwiOJko8r83KxGXQ"] .zpimage-container figure img { width:500px ; height:610.58px ; } } @media (max-width: 767px) { [data-element-id="elm_4V-igUMwiOJko8r83KxGXQ"] .zpimage-container figure img { width:500px ; height:610.58px ; } } [data-element-id="elm_4V-igUMwiOJko8r83KxGXQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-medium zpimage-tablet-fallback-medium zpimage-mobile-fallback-medium hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-list-format-view-2.png" width="500" height="610.58" loading="lazy" size="medium" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_TdEEhbc7o53tz3OCqvDUxA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_TdEEhbc7o53tz3OCqvDUxA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">There are relatively few examples or information on what to do next, but we will add a minimalist formatting skeleton.&nbsp; The syntax is described here <a href="https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/view-group-formatting">https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/view-group-formatting</a></span></p><p><span style="font-size:16px;">The “group by” headers are within “headerFormatter” within “groupProps”.</span></p><p><span style="font-size:16px;"><br></span></p></div></div></div>
</div><div data-element-id="elm_wPIvwZraWJdJCP5ZN-k-hA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_wPIvwZraWJdJCP5ZN-k-hA"] .zpimage-container figure img { width: 624px !important ; height: 204px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_wPIvwZraWJdJCP5ZN-k-hA"] .zpimage-container figure img { width:624px ; height:204px ; } } @media (max-width: 767px) { [data-element-id="elm_wPIvwZraWJdJCP5ZN-k-hA"] .zpimage-container figure img { width:624px ; height:204px ; } } [data-element-id="elm_wPIvwZraWJdJCP5ZN-k-hA"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-list-header-formatter.png" width="624" height="204" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_ibmSA-gbwnjsJyi9ckY_1w" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ibmSA-gbwnjsJyi9ckY_1w"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">The syntax for “headerFormatter” is identical to that of column format, with the important caveat that a lot of it, despite correct syntax, does not work.&nbsp; Yes, there is a “txtContent”, but things like “@currentField” and “[$FieldName]” are not defined and most special strings, most notably &quot;@UIlcid&quot;, are not available.</span></p><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">That makes determining the language and formatting the value depending on the language difficult, because all of the techniques discussed in previous posts are not available.</span></p><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">What is available is &quot;@group&quot;, which has three properties,&nbsp; &quot;fieldData&quot;, &quot;columnDisplayName&quot;, and &quot;count&quot;.&nbsp; Normally the use of column display names rather than internal names is a mistake.&nbsp; If you rely on it then things will break badly (like they do for list form JSON formatting) when you change the language, but in this case, that unfortunate design decision can be used to our advantage.</span></p><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">In this case we have already localized the column names by entering the translations in the MUI (Multilingual User Interface)&nbsp; That means that the “Progress” column has a column display name of “Progress” in English, “Progrès” in French, and “Fortschritt” in German.&nbsp; The value of “@group.columnDisplayName” therefore tells us what is the current UI language, as long as the column header has been localized and its name is different in different languages.</span></p><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">If we display the value of “@group.columnDisplayName” and of “@group.fieldData” in English we get this:</span></p><p><span style="font-size:16px;"><br></span></p></div></div></div>
</div><div data-element-id="elm_Bfj2YhXZNSw2U-G4islnNQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_Bfj2YhXZNSw2U-G4islnNQ"] .zpimage-container figure img { width: 624px !important ; height: 214px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_Bfj2YhXZNSw2U-G4islnNQ"] .zpimage-container figure img { width:624px ; height:214px ; } } @media (max-width: 767px) { [data-element-id="elm_Bfj2YhXZNSw2U-G4islnNQ"] .zpimage-container figure img { width:624px ; height:214px ; } } [data-element-id="elm_Bfj2YhXZNSw2U-G4islnNQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-List-View-Format-3.png" width="624" height="214" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_ED9PeQNDb-pmhox_wCEzVg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ED9PeQNDb-pmhox_wCEzVg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">We see “Progress=New application” But in French we get “Progrès=New application”</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_7w2z_fECcm5xtqHpoD3kWA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_7w2z_fECcm5xtqHpoD3kWA"] .zpimage-container figure img { width: 624px !important ; height: 220px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_7w2z_fECcm5xtqHpoD3kWA"] .zpimage-container figure img { width:624px ; height:220px ; } } @media (max-width: 767px) { [data-element-id="elm_7w2z_fECcm5xtqHpoD3kWA"] .zpimage-container figure img { width:624px ; height:220px ; } } [data-element-id="elm_7w2z_fECcm5xtqHpoD3kWA"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-List-View-Format-3-french.png" width="624" height="220" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_DupHYuOueDSwXatq9KZQCQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_DupHYuOueDSwXatq9KZQCQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">The “columnDisplayName” is localized by the MUI, but the column value is not localized by our column formatting.&nbsp; We can put this all together to take advantage of the display names.&nbsp; In the nested ifs below, we check the value of “@group.columnDisplayName” to determine the current language, then the current value, and then display the appropriate translation of that value.</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_JTDW_BnYzKN1MhT3o1ltZw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_JTDW_BnYzKN1MhT3o1ltZw"] .zpimage-container figure img { width: 520px !important ; height: 424px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_JTDW_BnYzKN1MhT3o1ltZw"] .zpimage-container figure img { width:520px ; height:424px ; } } @media (max-width: 767px) { [data-element-id="elm_JTDW_BnYzKN1MhT3o1ltZw"] .zpimage-container figure img { width:520px ; height:424px ; } } [data-element-id="elm_JTDW_BnYzKN1MhT3o1ltZw"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-list-groupcolumndisplayname.png" width="520" height="424" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_O1jFViZbg1drbickBDRcBw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_O1jFViZbg1drbickBDRcBw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">Here is the result, in French</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_KxtPeFV7WzUiR4fcmPgRig" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_KxtPeFV7WzUiR4fcmPgRig"] .zpimage-container figure img { width: 624px !important ; height: 180px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_KxtPeFV7WzUiR4fcmPgRig"] .zpimage-container figure img { width:624px ; height:180px ; } } @media (max-width: 767px) { [data-element-id="elm_KxtPeFV7WzUiR4fcmPgRig"] .zpimage-container figure img { width:624px ; height:180px ; } } [data-element-id="elm_KxtPeFV7WzUiR4fcmPgRig"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-groupcolumndisplayname-french.png" width="624" height="180" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Zi7jj8fUNxAL4ftOkF7AIw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_Zi7jj8fUNxAL4ftOkF7AIw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;"><br></span></p><p><span style="font-size:16px;">And in German</span></p><p><span style="font-size:16px;"><br></span></p></div></div>
</div><div data-element-id="elm_sSKnDDx3neTPfQGWoE-8Og" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_sSKnDDx3neTPfQGWoE-8Og"] .zpimage-container figure img { width: 624px !important ; height: 182px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_sSKnDDx3neTPfQGWoE-8Og"] .zpimage-container figure img { width:624px ; height:182px ; } } @media (max-width: 767px) { [data-element-id="elm_sSKnDDx3neTPfQGWoE-8Og"] .zpimage-container figure img { width:624px ; height:182px ; } } [data-element-id="elm_sSKnDDx3neTPfQGWoE-8Og"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-groupcolumndisplayname-german.png" width="624" height="182" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_tZfNHFK3Pn7SA5CQ4otM9g" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_tZfNHFK3Pn7SA5CQ4otM9g"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><div style="color:inherit;"><div style="color:inherit;"><p><br></p><p>What if the user decides to group by Position, a different Choice column, rather than by Progress?&nbsp; There is only one view formatting JSON no matter what you group by, and only one “groupProps” and one “headerFormatter”.&nbsp; Luckily the value of “group.columnDisplayName” detects not only the language but also which column is being grouped by, so you can just extend the nested ifs and localize all the choice columns from the view in a single “txtContent” expression.</p><p><br></p><p>The technique of using of “group.columnDisplayName” works for “@group” within the “group by” header as shown above, but it will also work for “@columnAggregate” in the footer and for the “@aggregates” array elements where applicable, and it also works for Gallery view.</p><p><span style="font-weight:bold;"><br></span></p><p><span style="font-weight:bold;">Was this useful? Leave us your questions in the comments section below!</span></p></div></div></div></div></div>
</div><div data-element-id="elm_K3suObFtGo0asxARDVqCHw" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"> [data-element-id="elm_K3suObFtGo0asxARDVqCHw"].zpelem-divider{ border-radius:1px; } </style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_9byRa4AaPkGjvrrkLJYgGw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_9byRa4AaPkGjvrrkLJYgGw"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><span style="font-family:&quot;Work Sans&quot;;font-size:16px;font-weight:700;color:rgb(11, 27, 45);">Related Posts</span><br></h2></div>
<div data-element-id="elm_kgdO1p9uCVzTeuWPSKQOBQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_kgdO1p9uCVzTeuWPSKQOBQ"].zpelem-text{ border-radius:1px; padding-block-start:0px; margin-block-start:-1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div><h1><div style="color:inherit;"></div></h1><h1><span style="font-family:&quot;Work Sans&quot;;font-size:16px;"><a href="https://blog.icefire.ca/blogs/post/language-dependent-json-column-formatting-this-time-it-s-the-uilcid-token" title="Language-dependent JSON column formatting: this time it's the @UIlcid token" target="_blank" rel="">Language-dependent JSON column formatting: this time it's the @UIlcid token</a></span></h1><h1><span style="font-size:16px;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);"><a href="https://blog.icefire.ca/blogs/post/language-dependent-json-column-formatting-using-the-lcid-token" title="Language-dependent JSON column formatting using the @lcid token" target="_blank" rel="">Language-dependent JSON column formatting using the @lcid token</a></span></h1><div><div style="color:inherit;"><h1><span style="font-size:16px;font-family:&quot;Work Sans&quot;;"><a href="https://blog.icefire.ca/blogs/post/json-for-different-text-in-different-languages" target="_blank" rel="">JSON for different text in different languages</a></span></h1></div>
</div></div></div></div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 08 Mar 2023 11:47:08 -0500</pubDate></item><item><title><![CDATA[The end of the Machine Translation Service in SharePoint Online ]]></title><link>https://blog.icefire.ca/blogs/post/machine-translation-service-end-sharepoint</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/SharePoint-variations.png"/>Microsoft is stopping the machine translation service for SharePoint Online. Here's what will stop working and what to do about it]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_NcZ2kw5aQD26WQHyPoXx9Q" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_LdWyJS8bReG0orREjVtdzg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"> [data-element-id="elm_LdWyJS8bReG0orREjVtdzg"].zprow{ border-radius:1px; } </style><div data-element-id="elm_OP6NvOPXQrKjwXkJsb3X7g" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"> [data-element-id="elm_OP6NvOPXQrKjwXkJsb3X7g"].zpelem-col{ border-radius:1px; } </style><div data-element-id="elm_Pl218yj6Qfm1g-aoOrJwRA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">Microsoft has announced that the Machine Translation Service (MTS) in SharePoint Online will stop working at the end of July 2022.&nbsp; Are you using it, and if so what can you do about it, to prepare for its retirement?</span></p></div></div>
</div><div data-element-id="elm_pqCSr0Kk1y8gPe_TZ9zF1g" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_pqCSr0Kk1y8gPe_TZ9zF1g"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h1><span style="font-size:20px;font-family:&quot;Work Sans&quot;;font-weight:700;color:rgb(0, 0, 0);">What is the Machine Translation Service?</span></h1></div></h2></div>
<div data-element-id="elm_Jok5RLlkXmsXuzLTXifvnA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_Jok5RLlkXmsXuzLTXifvnA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">MTS is a back-end SharePoint service application that works in SharePoint Online and in SharePoint 2013, 2016, 2019, and SE on premise.&nbsp; It is able to carry out machine translation of several different file types including Office files and html pages, and of plain text.&nbsp; Because it is built into SharePoint, using it is free.&nbsp; Since it is a back-end service, you have to look at the different front-end functionality that may be using it.</span></p></div></div>
</div><div data-element-id="elm_7spNKQw-MaH8zNF01yZ1ow" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_7spNKQw-MaH8zNF01yZ1ow"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h1><span style="font-size:20px;font-family:&quot;Work Sans&quot;;font-weight:700;color:rgb(0, 0, 0);">Where is it available in SharePoint?</span></h1></div></h2></div>
<div data-element-id="elm_x9QYTOVmGSDLgUP3dH5tdA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_x9QYTOVmGSDLgUP3dH5tdA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">There are three places where the Machine Translation Service is available for you to use in SharePoint: translation of Variations, translation of Term Sets, and translation via the API or PowerShell.&nbsp; Let’s look at these one by one.</span></p></div></div>
</div><div data-element-id="elm_arS8vTTB-bMYVkyPU9usQA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_arS8vTTB-bMYVkyPU9usQA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><span style="font-family:&quot;Work Sans&quot;;font-size:20px;color:rgb(0, 0, 0);font-weight:500;">1. Translation of Variations</span><br></h2></div>
<div data-element-id="elm_EjI4H2XFDnOdeeU4TwIS7w" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_EjI4H2XFDnOdeeU4TwIS7w"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">If you have been using Variations on Classic sites for a while, you may realize that it used to be possible to set up machine translation for a Variation label, which could machine translate pages either automatically or on demand.&nbsp; This uses MTS as a back-end.&nbsp; In September 2018, the user interface to machine translate Variation labels or classic pages was removed from SharePoint Online.&nbsp; The functionality itself persisted, that is to say if you had previously set up a Variation label with automatic translation before then, MTS continued translating any new pages automatically, but you simply couldn’t set it up for any new Variation labels.</span></p></div></div>
</div><div data-element-id="elm_UfDb8MFKNChiJulB7GiLaw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_UfDb8MFKNChiJulB7GiLaw"] .zpimage-container figure img { width: 372px !important ; height: 124px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_UfDb8MFKNChiJulB7GiLaw"] .zpimage-container figure img { width:372px ; height:124px ; } } @media (max-width: 767px) { [data-element-id="elm_UfDb8MFKNChiJulB7GiLaw"] .zpimage-container figure img { width:372px ; height:124px ; } } [data-element-id="elm_UfDb8MFKNChiJulB7GiLaw"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-variations.png" width="372" height="124" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Z3gozh4NXF_pw9hlGDdHDw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_Z3gozh4NXF_pw9hlGDdHDw"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h2><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:500;color:rgb(0, 0, 0);">2. Translation of Term Sets</span></h2></div></h2></div>
<div data-element-id="elm_RNzQOijfT0VhN9j68dbGLA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_RNzQOijfT0VhN9j68dbGLA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:11pt;">If you have created a term set in the term store, and you have set it up to have working languages in addition to the default language, then you have the option to machine translate the terms in a term set on demand, using the MTS.</p><p style="font-size:11pt;"><br></p><p style="font-size:11pt;">In the SharePoint Admin Centre, under Content Services, select “Term store”</p></div></div>
</div><div data-element-id="elm_HmzjwGcGUEuJfmP5UZ0GhQ" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_HmzjwGcGUEuJfmP5UZ0GhQ"] .zpimage-container figure img { width: 272px !important ; height: 108px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_HmzjwGcGUEuJfmP5UZ0GhQ"] .zpimage-container figure img { width:272px ; height:108px ; } } @media (max-width: 767px) { [data-element-id="elm_HmzjwGcGUEuJfmP5UZ0GhQ"] .zpimage-container figure img { width:272px ; height:108px ; } } [data-element-id="elm_HmzjwGcGUEuJfmP5UZ0GhQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-term-store.png" width="272" height="108" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_PZw0WpPpvWb3wpjLry_T4w" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_PZw0WpPpvWb3wpjLry_T4w"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:11pt;">At any point, you can add working languages to a term store.</p></div></div>
</div><div data-element-id="elm_ezyulvm-SfGbEennuOvDXg" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_ezyulvm-SfGbEennuOvDXg"] .zpimage-container figure img { width: 624px !important ; height: 452px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_ezyulvm-SfGbEennuOvDXg"] .zpimage-container figure img { width:624px ; height:452px ; } } @media (max-width: 767px) { [data-element-id="elm_ezyulvm-SfGbEennuOvDXg"] .zpimage-container figure img { width:624px ; height:452px ; } } [data-element-id="elm_ezyulvm-SfGbEennuOvDXg"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-Term-store1.png" width="624" height="452" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_UfMUTQ9uicxV1WPMSaK8ug" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_UfMUTQ9uicxV1WPMSaK8ug"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">Inside the term store, individual term sets provide the option to create translations to the other working languages.&nbsp; Under Translation, select Manage</span></p></div></div>
</div><div data-element-id="elm_qWGzTNOgU2SXFDrJIOxZZA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_qWGzTNOgU2SXFDrJIOxZZA"] .zpimage-container figure img { width: 624px !important ; height: 442px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_qWGzTNOgU2SXFDrJIOxZZA"] .zpimage-container figure img { width:624px ; height:442px ; } } @media (max-width: 767px) { [data-element-id="elm_qWGzTNOgU2SXFDrJIOxZZA"] .zpimage-container figure img { width:624px ; height:442px ; } } [data-element-id="elm_qWGzTNOgU2SXFDrJIOxZZA"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/Sharepoint-term-store2.png" width="624" height="442" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_ytCMOLWdZfhQR8ZICSTlMw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ytCMOLWdZfhQR8ZICSTlMw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">This will bring up the translation options.</span></p></div></div>
</div><div data-element-id="elm_RPV8ez56Vab8EZ7tC1aqJA" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_RPV8ez56Vab8EZ7tC1aqJA"] .zpimage-container figure img { width: 588px !important ; height: 418px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_RPV8ez56Vab8EZ7tC1aqJA"] .zpimage-container figure img { width:588px ; height:418px ; } } @media (max-width: 767px) { [data-element-id="elm_RPV8ez56Vab8EZ7tC1aqJA"] .zpimage-container figure img { width:588px ; height:418px ; } } [data-element-id="elm_RPV8ez56Vab8EZ7tC1aqJA"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-translation-options.png" width="588" height="418" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm__h7pEd3XEOx7L0c751tk5g" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm__h7pEd3XEOx7L0c751tk5g"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">One of the options is Machine translation.&nbsp; Press Start.&nbsp; You will then have to select one language to translate to.&nbsp; You can come back later and choose the other languages one by one.</span></p></div></div>
</div><div data-element-id="elm_T1208Ghu89AKx4LV1Dicsw" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_T1208Ghu89AKx4LV1Dicsw"] .zpimage-container figure img { width: 380px !important ; height: 386px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_T1208Ghu89AKx4LV1Dicsw"] .zpimage-container figure img { width:380px ; height:386px ; } } @media (max-width: 767px) { [data-element-id="elm_T1208Ghu89AKx4LV1Dicsw"] .zpimage-container figure img { width:380px ; height:386px ; } } [data-element-id="elm_T1208Ghu89AKx4LV1Dicsw"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-machine-translation.png" width="380" height="386" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_SGeuXrjDxFb1liVqUvaKEA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_SGeuXrjDxFb1liVqUvaKEA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">Translation is often quite slow.&nbsp; It is using the MTS in the back-end.&nbsp; You may have to wait a while and if you are the first person to use it that day, it might time out before the service has a chance to fully start up and you may have to start again.</span></p></div></div>
</div><div data-element-id="elm_7sknmqdKIJAwjoH3Kvbn1g" data-element-type="image" class="zpelement zpelem-image "><style> @media (min-width: 992px) { [data-element-id="elm_7sknmqdKIJAwjoH3Kvbn1g"] .zpimage-container figure img { width: 304px !important ; height: 156px !important ; } } @media (max-width: 991px) and (min-width: 768px) { [data-element-id="elm_7sknmqdKIJAwjoH3Kvbn1g"] .zpimage-container figure img { width:304px ; height:156px ; } } @media (max-width: 767px) { [data-element-id="elm_7sknmqdKIJAwjoH3Kvbn1g"] .zpimage-container figure img { width:304px ; height:156px ; } } [data-element-id="elm_7sknmqdKIJAwjoH3Kvbn1g"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="" data-size-mobile="" data-align="left" data-tablet-image-separate="false" data-mobile-image-separate="false" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/SharePoint-machine-translation2.png" width="304" height="156" loading="lazy" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_YhE5fvBfXNyYhh3cktSMKA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_YhE5fvBfXNyYhh3cktSMKA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p style="font-size:11pt;">Once the term set is translated, the text will be fully translated to the other languages and the translated version of the term site is (often) what will be shown to the user based on their language.</p></div></div>
</div><div data-element-id="elm_YcYIOxzgEZV8OXdxJQLgtA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_YcYIOxzgEZV8OXdxJQLgtA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h2><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:500;color:rgb(0, 0, 0);">3. Translation via the API or PowerShell</span></h2></div></h2></div>
<div data-element-id="elm_dy1Q430wqoJiNUgL4qK7eA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_dy1Q430wqoJiNUgL4qK7eA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><p><span style="font-size:16px;">Without going into too much detail, the translation capability of the MTS is available via CSOM or REST.&nbsp; That means it can be called from C#, JavaScript, or PowerShell.&nbsp; The MTS API lets you translate either a short text or a supported document or even an entire folder or library, either using a stream or a SharePoint file URL.&nbsp; In the back-end it is using MTS.&nbsp; It is possible that one of the customizations or products that you use are calling this API.&nbsp; If you have custom code or apps that generate some translation, there are good chances that it is using the API to call MTS.</span></p></div></div>
</div><div data-element-id="elm_18BjRiIWeh_3MvI2uAqviw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_18BjRiIWeh_3MvI2uAqviw"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h1><span style="font-size:20px;font-family:&quot;Work Sans&quot;;font-weight:700;color:rgb(0, 0, 0);">What will no longer work?</span></h1></div></h2></div>
<div data-element-id="elm_NhywRpuiZ6JzWHQ-5LyVBQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_NhywRpuiZ6JzWHQ-5LyVBQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><div style="color:inherit;"><p><span>On March 7, 2022, Microsoft announced that the Machine Translation Service in SharePoint Online will be retired at the end of July 2022.&nbsp; Existing automated translation in Variations will stop working and the APIs will be retired.&nbsp; Calls to the APIs will result in an error.&nbsp; The full announcement is here:</span></p><p><span><a href="https://devblogs.microsoft.com/microsoft365dev/end-of-service-for-sharepoint-online-machine-translation-service-and-apis/" title="https://devblogs.microsoft.com/microsoft365dev/end-of-service-for-sharepoint-online-machine-translation-service-and-apis/" rel="">https://devblogs.microsoft.com/microsoft365dev/end-of-service-for-sharepoint-online-machine-translation-service-and-apis/</a></span></p><p><br></p><p><span>This means that in August 2022, existing translation of Variations, which had survived the 2018 deprecation, will stop working.&nbsp; New pages will be copied to the Variation label but not translated.&nbsp; Any customizations or apps that you use which use the MTS API will start returning errors.</span></p><p><span><br></span></p><p><span>The announcement is not explicit that the machine translation of term sets will also be discontinued, but even if it is not retired in July you should be prepared to see it disappear soon like all other uses of the Machine Translation Service.&nbsp; If it is discontinued, then term sets that have already been translated will stay translated, but any new terms or term sets will have to be translated manually by humans.</span></p></div></div></div></div>
</div><div data-element-id="elm__toYXtkVYXAveoDrSg-IyQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm__toYXtkVYXAveoDrSg-IyQ"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><h1><span style="font-family:&quot;Work Sans&quot;;font-size:20px;font-weight:700;color:rgb(0, 0, 0);">What to do about it</span></h1></div></h2></div>
<div data-element-id="elm_1OSobI8iUQtowW0nV2B_Fw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_1OSobI8iUQtowW0nV2B_Fw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;">Maybe it doesn’t apply to you and no action is required.</span></p><ul><li>If you don’t use the machine translation features described above nor any customization that uses the Machine Translation Service, don’t worry about it.&nbsp; It’s not the ability of Variations to display classic pages in different languages that is disappearing, it is the machine translation of those pages, a feature that you have not been able to set up for nearly 4 years.&nbsp; Similarly, it’s not the ability to display term set terms in different languages that is disappearing, it is the machine translation of those terms.</li></ul><ul><li>If you are using SharePoint on premise, the announcement does not affect you, it is only for SharePoint Online. MTS will continue to work on premise.</li></ul><ul><li>If you are using the multilingual page publishing feature of modern communication sites, you will similarly not be affected since SharePoint never offered machine translation for those pages in the first place.</li></ul><p><span><br></span></p><p><span>If you <u>are</u> using one of those features, then you will either start translating manually of find a different alternative.</span></p><p><span>The announcement suggests that you can use modern communication sites or Azure translation APIs as an alternative.&nbsp; Are they alternatives to the loss of machine translation?&nbsp; Modern communication sites do not offer machine translation at all, and Azure translation APIs do not support any modern pages.&nbsp; In fact, the majority of types of classic pages are also not supported by Azure translation APIs.&nbsp; For document translation, Azure Translation APIs support roughly the same document types as MTS, but they are not a simple replacement for the MTS API.&nbsp; They do not support streams or SharePoint library URLs.&nbsp; Instead, they support text strings of limited length or Azure blob storage containers.&nbsp; That means that some extra complexity and security considerations if you are trying to port the code yourself, while the MTS API call was often a single line of code.</span></p><p><span><br></span></p><p><span>If you are using the MTS API to translate short lines of plain text rather than documents, then the Azure Translation APIs are a viable alternative.&nbsp; It will take some re-coding but a reasonable amount of it, since&nbsp; the Azure API for translating short strings is much simpler than the API for translating documents.</span></p><p><span><br></span></p><p><span>If you use PointFire products to translate your pages, documents, or user interface, then little will change.&nbsp; The <u>free</u> version of the app will need some additional configuration in order to use the Azure Translation API, making it a bit less free to you (you will have to pay Microsoft about $15 USD per million characters, plus a few cents for the Azure storage operations). The <u>paid</u> version of PointFire Translator has been using the Azure Translation API all along, and it has been parsing SharePoint documents and pages to extract strings so that you don’t need to use Azure blob storage.&nbsp; No change is required.</span></p><p><span><br></span></p><p>Additionally, <a href="http://pointfire.com" title="PointFire" rel="">PointFire</a> already supports not only Classic pages like Variations but also Communication sites, whether they use Multilingual Page Publishing feature or not, and in fact every type of page, modern or classic, on any SharePoint site, as well as documents, lists, and metadata.</p></div>
</div></div></div></div><div data-element-id="elm_VaUz0n5O9TUt92jkPB7YZw" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"> [data-element-id="elm_VaUz0n5O9TUt92jkPB7YZw"].zpelem-divider{ border-radius:1px; } </style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_c1b6uSAWIOYYtpw4R5VjKw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_c1b6uSAWIOYYtpw4R5VjKw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;">If you want to know how this end of service affects you, talk to us for a free consultation and absolutely no commitment or need to use PointFire! We'll help you figure out your next move.</span><br></p></div>
</div><div data-element-id="elm_KwjvEtLLPvgm1ttLEGTeDw" data-element-type="button" class="zpelement zpelem-button "><style> [data-element-id="elm_KwjvEtLLPvgm1ttLEGTeDw"].zpelem-button{ font-family:'Work Sans'; font-size:16px; font-weight:500; border-radius:1px; } </style><div class="zpbutton-container zpbutton-align-left "><style type="text/css"> [data-element-id="elm_KwjvEtLLPvgm1ttLEGTeDw"] .zpbutton.zpbutton-type-primary{ background-color:#3C9BF3 !important; font-family:'Work Sans'; font-size:16px; font-weight:500; border-radius:100px; } </style><a class="zpbutton-wrapper zpbutton zpbutton-type-primary zpbutton-size-md zpbutton-style-none " href="mailto:sales@icefire.ca?subject=End%20of%20SharePoint%20Machine%20Translation"><span class="zpbutton-content">Let's talk</span></a></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 06 May 2022 11:35:31 -0400</pubDate></item><item><title><![CDATA[Microsoft Lists Templates are Unilingual]]></title><link>https://blog.icefire.ca/blogs/post/microsoft-lists-templates-are-uniligual2</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/download-1.png"/>Now that list creation experience is making it easier to create lists from templates, and before the ability to create your own list templates rolls o ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_Ecv0tNr4Q1qWYriTZuGelg" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_ZNoei9dmSzaIO6xLHMAkLw" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_Ulyti2UJRU6DRzrrGG6Ulg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_TA0y5sA2Q56oEseM80tRYg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_TA0y5sA2Q56oEseM80tRYg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><p style="text-align:left;margin-bottom:15px;"><span style="font-size:16px;">Now that list creation experience is making it easier to create lists from templates, and before the ability to create your own list templates rolls out, I thought I would point out that these Microsoft list templates are mostly unilingual.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="text-align:left;margin-bottom:15px;"><span style="font-size:16px;">Creating a new list from a template is very convenient, and it can be done in any language, and on any site, but the lists themselves are unilingual and are in the language of the user at the time that the list was created.</span></p><p style="text-align:left;margin-bottom:15px;"><span style="font-size:16px;"><br></span></p><p style="text-align:left;margin-bottom:15px;">TEST CHANGE HERE</p></div>
</div><div data-element-id="elm_ksEhK0QVnD8xVY3jJSQ2yg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_ksEhK0QVnD8xVY3jJSQ2yg"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="size-original" data-size-mobile="size-original" data-align="left" data-tablet-image-separate="" data-mobile-image-separate="" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/download-1.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_tW0ugeD6zMcPhp-Q1y-YEg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_tW0ugeD6zMcPhp-Q1y-YEg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-size:16px;">The language of the user depends on several things, including the alternate languages of the site.&nbsp; The Microsoft Lists site itself can have alternate languages.&nbsp; Depending on the year when your “my site” or OneDrive was created, it might have only one language or all languages activated.&nbsp; You can check this by modifying the URL while on a Microsoft Lists or OneDrive site (it’s the same site) to this:</span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">https://tenant-my.sharepoint.com/personal/(youremail)/_layouts/15/muisetng.aspx</span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">When a list is created from a template, the names and descriptions of the list and the columns are created using the current language of the person who is creating the list, no matter the base language of the site.&nbsp; If my language is English and I create a travel requests list, it is completely in English.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">If I change my language and display the same list, it is also completely in English, or almost.&nbsp; In the image below, where my language is French, you see that the word ‘’Today” in the date fields is replaced with the word “Aujourd’hui”</span></p></div>
</div><div data-element-id="elm_UOeFCIb8W8i0E8xrArEgSQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_UOeFCIb8W8i0E8xrArEgSQ"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="size-original" data-size-mobile="size-original" data-align="center" data-tablet-image-separate="" data-mobile-image-separate="" class="zpimage-container zpimage-align-center zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/TRAVEL-1.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_dfeL_V2g62kSU7sk7uz4OQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_dfeL_V2g62kSU7sk7uz4OQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-size:16px;">This is different from the old “create a custom list” experience, where at least the “Title” column would have a different name in different languages right from the start.<br><br>If my language is French at the time of creating a list from a template, it will create the list in French, even on a site where English is the site’s base language.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">In the image below I created the list from the “Issue Tracking” template while my language was French, then changed my language to German.</span></p></div>
</div><div data-element-id="elm_b1Ht5EEcoFs0yOiyD2Nz1g" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_b1Ht5EEcoFs0yOiyD2Nz1g"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="size-original" data-size-mobile="size-original" data-align="center" data-tablet-image-separate="" data-mobile-image-separate="" class="zpimage-container zpimage-align-center zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/ISSUE-1.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_sRXHpED6nTOGfjg1FBxq_A" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_sRXHpED6nTOGfjg1FBxq_A"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-size:16px;">The column “Anlagen” (attachment) is the only column which is translated out of the box, all the others are still in French.&nbsp; It is possible to use the SharePoint MUI to add translations of the list and columns names and descriptions in all languages.&nbsp; I cheated and used PointFire 365 to translate them all in a single step.&nbsp; When that is done, the list headers are in the language of the user.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">One thing that cannot be localized with the MUI is the values of Choice columns.&nbsp; So for instance the possible values of the “Priority” column will be “Critique”, “Élevé”, “Normal”, and “Faible” in all languages.&nbsp; The JSON that formats these columns is also generated in French in this case, where the formatting depends of the value of the column (in French).</span></p></div>
</div><div data-element-id="elm_uu7XkxuNqUuah6K_P36-aw" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_uu7XkxuNqUuah6K_P36-aw"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="size-original" data-size-mobile="size-original" data-align="left" data-tablet-image-separate="" data-mobile-image-separate="" class="zpimage-container zpimage-align-left zpimage-size-original zpimage-tablet-fallback-original zpimage-mobile-fallback-original hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/JSON-1.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_ibwQmii_x7JHzntilX-Rfw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ibwQmii_x7JHzntilX-Rfw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">You will also notice in the JSON that even though the list was created in French, the internal name of the column “Priority” is in English, and in fact is the same internal name in all languages.&nbsp; That is handy when you write thing like Power Automate flows or PowerShell scripts, you don’t need to write different ones in different languages as long as you always refer to the internal name of the column, not the column title.&nbsp; While you’re at it, if you’re writing JSON for formatting, make sure that everything is based on the @currentField, not @currentField.displayValue or friendly formats, because those can be language-sensitive and stop working when users have a different language.</span><br></p></div>
</div><div data-element-id="elm_kgt9pgoU16HyjHwnb9tN-w" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"> [data-element-id="elm_kgt9pgoU16HyjHwnb9tN-w"].zpelem-divider{ border-radius:1px; } </style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_twvbXb3NuB3T3IzsfCgP0A" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_twvbXb3NuB3T3IzsfCgP0A"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><span style="font-size:16px;">Related Posts</span></h2></div>
<div data-element-id="elm_-yRhAGGB49e49uNqu12aaA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_-yRhAGGB49e49uNqu12aaA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/localization-of-spfx-webparts-in-microsoft-teams-tabs" title="Localization of SPFx webparts in Microsoft Teams tabs" rel="">Localization of SPFx webparts in Microsoft Teams tabs</a></span></p><p><a href="https://blog.icefire.ca/blogs/post/how-microsoft-forms-sets-the-display-language-for-multilingual-forms" rel="">How Microsoft Forms Sets the Display Language for Multilingual Forms</a><br></p><p><span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/how-to-make-sharepoint-api-calls-language-independent" rel="">How to make SharePoint API calls language-independent</a></span><br></p></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 30 Mar 2021 06:03:00 -0400</pubDate></item><item><title><![CDATA[Inuktitut machine translation is here. Why that's a big deal.]]></title><link>https://blog.icefire.ca/blogs/post/inuktitut-machine-translation-is-here-why-that-s-a-big-deal1</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/INUKTITUT-1.png"/>Azure Translator Text now supports the Inuktituk language spoken in the Inuit area in the far north of North America.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm__uaIH0jcQxSnYhilZfwi7w" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_vZmFG8xlSwSw0UcWb4khyQ" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_w1VhFEDrQ_ShtiBhuJ438A" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_9ibTL2zXQt2JnqYYoa8gpw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_9ibTL2zXQt2JnqYYoa8gpw"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><p style="text-align:left;"><span style="color:inherit;font-size:16px;">Azure Translator Text now&nbsp;<a href="https://news.microsoft.com/en-ca/2021/01/27/microsoft-introduces-inuktitut-to-microsoft-translator/">supports the Inuktituk language</a>&nbsp;spoken in the Inuit area in the far north of North America.</span></p><div style="text-align:left;font-size:14px;"><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div style="text-align:left;"><span style="font-size:16px;">Over the years, I've received a lot of requests to provide machine translation for Inuktitut.&nbsp; Despite the tools that are available, particularly from Microsoft, to&nbsp;<a href="https://portal.customtranslator.azure.ai/">train your own neural translation engine&nbsp;</a>for an unsupported language using a corpus of translated documents, and a great&nbsp;<a href="https://www.aclweb.org/anthology/2020.lrec-1.312/">bilingual corpus</a>&nbsp;from the debates of the&nbsp;<a href="http://www.inuktitutcomputing.ca/NunavutHansard/info.php?lang=en">Nunanut legislative assembly</a>, I knew that this would not be possible.&nbsp; Other machine translation experts also agreed that it was beyond the state of the art.&nbsp; On a couple of occasions I had applied for funding to push beyond the state of the art to make this possible, unsuccessfully.&nbsp; Why is machine translation of Inuktitut so difficult?</span></div></div>
</div><div data-element-id="elm__jZB9Zi9F3KKYkuoh9q-3w" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm__jZB9Zi9F3KKYkuoh9q-3w"].zpelem-image { border-radius:1px; } </style><div data-caption-color="" data-size-tablet="size-original" data-size-mobile="size-original" data-align="left" data-tablet-image-separate="" data-mobile-image-separate="" class="zpimage-container zpimage-align-left zpimage-size-fit zpimage-tablet-fallback-fit zpimage-mobile-fallback-fit hb-lightbox " data-lightbox-options="
                type:fullscreen,
                theme:dark"><figure role="none" class="zpimage-data-ref"><span class="zpimage-anchor" role="link" tabindex="0" aria-label="Open Lightbox" style="cursor:pointer;"><picture><img class="zpimage zpimage-style-none zpimage-space-none " src="/INUKTITUT-1.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_yEkm9WpDQhOR5O6BF7rYJA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_yEkm9WpDQhOR5O6BF7rYJA"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="font-size:14px;"><div><span style="font-size:16px;">Inuktitut belongs to a class called &quot;polysynthetic languages&quot;.&nbsp; Most of the languages that you know are probably &quot;agglutinative&quot;&nbsp; There are some root words which can be modified by changing the beginning or the end of the word.&nbsp; The root word is in the dictionary, but the words that are modified by adding or changing suffixes and prefixes are typically not, because eveyone knows the rules.&nbsp; These agglutinative languages are part of a larger class called synthetic languages, which includes other simple rules for sticking words together, usually with a small set of rules that apply to one part of speech.&nbsp; For example German can stick a lot of known nouns end-to-end to make a new word, but there is one root word and all the other words are modifying or narrowing down the sense one of the words, and the resulting word behaves like a longer version of the base word, and has the same part of speech.</span></div><div><br></div><div><span style="font-size:16px;">Inuktitut is polysynthetic.&nbsp; The combination rules are much more complex.&nbsp; There can be several root&nbsp;concepts and root&nbsp;words, and it can lose its part of speech or change it because the full word is an entire sentence with subject object, verb, adjective, even subordinate clauses, all contained in a big compound word. How you join words together can vary using complex rules about what comes before and after the join.&nbsp; A well known example is the word &quot;ᖃᖓᑕᓲᒃᑯᕕᒻᒨᕆᐊᖃᓛᖅᑐᖓ&quot; which means &quot;I'll have to go to the airport&quot;.&nbsp; Verbs, nouns, subject, object, they're all contained in the same word.</span></div><div><br></div><div><span style="font-size:16px;">Not all but most native American languages are polysynthetic.&nbsp; Unlike other languages, neural networds can't just have a dictionary and some rules and train the translation engine to see patterns of three or four words in a row that always translate to the same 3 or 4 words in another language.&nbsp; Almost all the neural translation engines I have seen are word-based.&nbsp; There are languages that are written without spaces, like Chinese, Japanese, Thai,&nbsp;and Korean, but they still have individual words and breaking them up into individual words is relatively simple.&nbsp; Not so with polysynthetic languages.</span></div><div><br></div><div><span style="font-size:16px;">I don't see any information about how Microsoft tackled the problem for Inuktitut.&nbsp; I am assuming that they used a tool to break down words into morphemes.&nbsp; What I would have used but didn't get funding for was the National Research Council's&nbsp;<a href="http://www.inuktitutcomputing.ca/Uqailaut/info.php">Uqailaut Inuktitut Morphological Analyzer</a>, but I don't know whether Microsoft did something similar.&nbsp; I am watching for any publications about it. There have been&nbsp;<a href="https://www.clsp.jhu.edu/workshops/19-workshop/neural-polysynthetic-language-modeling-leveraging-related-low-resource-languages-and-rule-based-resources/">some advances lately</a>&nbsp;in&nbsp;<a href="https://github.com/neural-polysynthetic-language-modelling">modeling and translating these languages</a>, so that is not the only approach.</span></div><div><br><span style="font-size:16px;">On the other hand, perhaps they trained a neural network to decompose into morphemes and vice-versa without a standalone processor.&nbsp; If that's the case, then the same techniques could be used for various other widespread but hard to translate polysynthetic languages from the Algonquian language family like Cree and Ojibwe, or Iroquoian languages like Mohawk, or Athabascan langauges like Dene or Navajo, or Siouan languages like Dakotan.&nbsp; It's a game changer.</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">Oh, and if you were curious, PointFire Translator now supports translation to and from Inuktitut on SharePoint sites, just use language code &quot;iu&quot;.&nbsp; Your browser should already support Canadian Aboriginal Syllabics.</span></div></div></div>
</div><div data-element-id="elm_g1dAcLKU5Y6LQBEiqtUzMw" data-element-type="divider" class="zpelement zpelem-divider "><style type="text/css"> [data-element-id="elm_g1dAcLKU5Y6LQBEiqtUzMw"].zpelem-divider{ border-radius:1px; } </style><style></style><div class="zpdivider-container zpdivider-line zpdivider-align-center zpdivider-width100 zpdivider-line-style-solid "><div class="zpdivider-common"></div>
</div></div><div data-element-id="elm_eKoz0-Mq42FM9P3nm8VdFQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_eKoz0-Mq42FM9P3nm8VdFQ"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><span style="font-size:16px;">Related Posts</span></h2></div>
<div data-element-id="elm_h1v9YM8MfXtbOBqesqlpTQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_h1v9YM8MfXtbOBqesqlpTQ"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/Machine-Translation-in-PointFire-20131" target="_blank" rel="">Machine Translation in PointFire 2013</a></span><br></p><p><span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/Why-Do-We-Need-PointFire-for-Multilingual-Collaboration-in-SharePoint-Part-II" title="Why Do We Need PointFire for Multilingual Collaboration in SharePoint? Part II" target="_blank" rel="">Why Do We Need PointFire for Multilingual Collaboration in SharePoint? Part II</a></span><a href="https://blog.icefire.ca/blogs/post/Why-Do-We-Need-PointFire-for-Multilingual-Collaboration-in-SharePoint-Part-II" title="Why Do We Need PointFire for Multilingual Collaboration in SharePoint? Part II" target="_blank" rel=""><br></a></p><p><span style="color:inherit;"><a href="https://blog.icefire.ca/blogs/post/Why-Do-We-Need-PointFire-for-Multilingual-Collaboration-in-SharePoint-Part-III" target="_blank" rel="">Why Do We Need PointFire for Multilingual Collaboration in SharePoint? Part III</a></span></p></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 05 Feb 2021 23:02:00 -0500</pubDate></item><item><title><![CDATA[Why Do We Need PointFire for Multilingual Collaboration in SharePoint? Part I]]></title><link>https://blog.icefire.ca/blogs/post/why-do-we-need-pointfire-for-multilingual-collaboration-in-sharepoint-part-i</link><description><![CDATA[While SharePoint does provide certain multilingual features, we find that our clients require a little more flexibility and responsiveness in the mult ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_4yOhGq1yRWiRxkHpNvMJIw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_pWAaZVzQSquZ4_QgNT_eOQ" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_gjN3Fg7PQJ6A2yx1uDBp3A" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"> [data-element-id="elm_gjN3Fg7PQJ6A2yx1uDBp3A"].zpelem-col{ border-radius:1px; } </style><div data-element-id="elm_FTKb49b8Tsy70KdzC-oVag" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_FTKb49b8Tsy70KdzC-oVag"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><div style="text-align:left;font-size:13px;"><div><div><span style="font-size:16px;">While SharePoint does provide certain multilingual features, we find that our clients require a little more flexibility and responsiveness in the multilingual user interface and content delivery as well as a simplified method to manage multilingual content and documents. PointFire provides this solution as well as providing many other useful tools for customizing the look and behavior of your SharePoint sites.</span></div><div><span style="font-size:16px;">&nbsp;</span></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">Here is Part I of this series that will cover the reasons you need PointFire in a multilingual SharePoint environment.</span></div></div></div></div>
</div><div data-element-id="elm_ZgKv2wS37NzamXRh0hthsA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_ZgKv2wS37NzamXRh0hthsA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div style="font-size:13px;"><div><span style="font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;font-weight:700;">Translation Control</span></div></div></h2></div>
<div data-element-id="elm_gc2Vj52JnFpIzmylmUUWwg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_gc2Vj52JnFpIzmylmUUWwg"].zpelem-text{ border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="font-size:13px;"><div><span style="font-size:16px;">If you look at the list of elements that the SharePoint MUI doesn't support, PointFire supports all of the rest, with very few exceptions (some aspects of Silverlight and InfoPath, for which we provide workarounds). You can see a few specific scenarios in the first few pages of the PointFire 2010 User GuideGuide&nbsp;<a href="http://community.icefire.ca/index.php?%2FKnowledgebase%2FArticle%2FView%2F97%2F9%2Fpointfire-2010-user-guide" target="_blank">http://community.icefire.ca/index.php?/Knowledgebase/Article/View/97/9/pointfire-2010-user-guide</a></span></div>
<div><span style="font-size:16px;">&nbsp;</span></div><div><span style="font-size:16px;">First and foremost: content. &nbsp;PointFire does not only handle the &quot;chrome&quot; but user-generated content as well. &nbsp;It reaches inside html pages and inside lists and libraries to translate what you want it to translate. &nbsp;It intercepts ajax calls, RSS feeds, and some Javascript to translate as appropriate. &nbsp;Here is a partial list of elements that PointFire does and the SharePoint MUI doesn't</span></div>
<div><span style="font-size:16px;">&nbsp;</span></div><div><p><span style="font-size:16px;">webpart titles and properties</span></p><p><span style="font-size:16px;">custom webparts</span></p><p><span style="font-size:16px;">templates that MUI doesn't support, such as blogs and workspaces</span></p><p><span style="font-size:16px;">custom properties</span></p><p><span style="font-size:16px;">custom additions to various menus &amp; ribbons</span></p><p><span style="font-size:16px;">search refiners</span></p><p><span style="font-size:16px;">permission types</span></p><p><span style="font-size:16px;">group names</span></p><p><span style="font-size:16px;">multi-valued columns values</span></p><p><span style="font-size:16px;">calculated text fields</span></p><p><span style="font-size:16px;">ajax</span></p><p><span style="font-size:16px;">embedded xml</span></p><p><span style="font-size:16px;">embedded javascript</span></p><p><span style="font-size:16px;">alert &amp; popup messages</span></p><p><span style="font-size:16px;">dialogue boxes</span></p><p><span style="font-size:16px;">custom new/edit/ etc forms</span></p><p><span style="font-size:16px;">questionnaires</span></p><p><span style="font-size:16px;">views</span></p><p><span style="font-size:16px;">folder names</span></p><ul></ul><div><span style="font-size:16px;">In addition, it does some translations with less effort than the MUI in many cases. &nbsp;For instance, if you add a custom list and put it in the quick-launch menu, then provide the translation of the list name, the translated list name will not appear in the menu unless you edit it separately. &nbsp;With PointFire, you only have to add the translation in one place. &nbsp; In fact, if the same list name is used elsewhere in a different site, PointFire can inherit that translation from another site.</span></div>
</div><div><span style="font-size:16px;">&nbsp;</span></div><p></p><div><span style="font-size:16px;">Of course, translation is only one of the 4 localization techniques that PointFire makes available. &nbsp;There are much more powerful filtering techniques that allow you to tag content in lists, libraries, pages, and webparts as being in one language or the other, allowing SharePoint to assemble the page in the user's language while using the same URL.</span></div><div><span style="font-size:16px;"><br></span></div><div><div><span style="color:inherit;font-size:16px;"><div><a href="http://blog.icefire.ca/post/Why-Do-We-Need-PointFire-for-Multilingual-Collaboration-in-SharePoint-Part-II">More on that in Part II</a></div><div>&nbsp;</div><div><a href="http://pointfire.ca/try/">Tried PointFire yet? If not, why not? Download a free trial today!</a></div></span></div></div>
</div></div></div></div></div></div></div></div> ]]></content:encoded><pubDate>Sun, 14 Jul 2013 22:59:00 -0400</pubDate></item></channel></rss>