<?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/Uncategorized/feed" rel="self" type="application/rss+xml"/><title>The PointFire Blog - The PointFire Blog for Multilingual SharePoint , Uncategorized</title><description>The PointFire Blog - The PointFire Blog for Multilingual SharePoint , Uncategorized</description><link>https://blog.icefire.ca/blogs/Uncategorized</link><lastBuildDate>Tue, 22 Jul 2025 07:14:10 -0700</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[Big Changes to PnP PowerShell Scripts on September 8, 2024]]></title><link>https://blog.icefire.ca/blogs/post/big-changes-to-pnp-powershell-scripts-on-september-8-2024</link><description><![CDATA[The “PnP Management Shell” multi-tenant app registration will be deleted on September 8, 2024. This will affect every script that uses “Interactive” login to connect to SharePoint or to Microsoft Graph. PointFire is releasing its own script to solve the issue.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_lmk9h-FKQsO2ssDIaY0Qew" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_FVJFHCJPTTqGvlEuqArt_A" 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_uqnvUw8KQlGcEIzHl6Hb1g" 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_DCeHYpFJQxiRcltFSTXL-w" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p style="text-align:left;">On August 21, 2024 Vesa Juvonen, Principal Product Manager at Microsoft announced on behalf of the PnP PowerShell and CLI for Microsoft 365 groups that the <a href="https://pnp.github.io/blog/post/changes-pnp-management-shell-registration/" title="“PnP Management Shell” multi-tenant app registration would be deleted" target="_blank" rel="">“PnP Management Shell” multi-tenant app registration would be deleted</a> on September 8, 2024.&nbsp; This means that on that day, every script that uses the recommended “Interactive” login to connect to SharePoint or to Microsoft Graph will stop working.</p><p style="text-align:left;"><span><br></span></p><p style="text-align:left;"><span><br></span></p><p style="text-align:left;"><br></p><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">This has a major impact on most people using PnP PowerShell scripts.&nbsp; The interactive login method is often the default method used, since it supports a lot of authentication methods including most forms of Multi-Factor Authentication (MFA), and it does not require tenant-specific parameters in the script.&nbsp; This allows PowerShell scripts to be signed for extra security.</span></p><p style="text-align:left;font-size:11pt;"><br></p><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">Why is it called a multi-tenant app registration?&nbsp; This is because the maximum permissions that can be used by scripts that use Interactive connections to SharePoint are set in an AzureAD/EntraID app that is maintained by Microsoft Patterns and Practices (PnP) group in their tenant and is made available to be used by any tenant.&nbsp; The actual permissions are limited to the lower of those permissions and the permissions of the user that is logging in to SharePoint.</span></p><p style="text-align:left;font-size:11pt;"><br></p><div style="color:inherit;"><p style="text-align:left;"><span style="font-size:16px;">Until September 8, any tenant that wanted to use the “Interactive” login would have needed to invoke the “Register-PnPManagementShellAccess”&nbsp; command, once only, in order to have access to this “PnP Management Shell” app registration from within this tenant.&nbsp; Consenting to this could only be done by Azure AD administrators or Global administrators.&nbsp; After September 8, that consent within your tenant disappears because the original app registration itself will disappear, along with all its permissions.&nbsp; Anyone trying to use a script with Interactive login will fail, since the authentication relies on that app registration.</span></p></div>
</div></div></div></div></div></div><div data-element-id="elm_qtyk6Hfa8RXAHbr9SFZFhA" data-element-type="heading" class="zpelement zpelem-heading "><style></style><h3
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><p><span style="font-family:&quot;Work Sans&quot;;font-size:16px;font-weight:700;color:rgb(11, 27, 45);">What is the alternative?</span></p></div></h3></div>
<div data-element-id="elm_DPtJ0adMKRQhEBwJJuNXYA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-left " data-editor="true"><div style="color:inherit;"><div style="color:inherit;"><p><span style="font-size:16px;">The alternative, according to Microsoft, is to create your own single-tenant app registration in your own tenant’s EntraID, and use a different form of Interactive login.&nbsp; A command to create such a single-tenant app registration is being prepared by the PnP group, but at the time of writing three days before the deadline, it has not yet been released as part of PnP PowerShell</span></p><p style="font-size:11pt;"><br></p><p><a href="https://pnp.github.io/powershell/cmdlets/Register-PnPEntraIDAppForInteractiveLogin.html" title="Register-PnPEntraIDAppForInteractiveLogin" target="_blank" rel="">Register-PnPEntraIDAppForInteractiveLogin</a></p><p style="font-size:11pt;"><br></p><div style="color:inherit;"><p><span style="font-size:16px;">With time running out, PointFire is releasing its own script, which uses existing PnP commands to register an app called “PointFire PnP login” in your own tenant.&nbsp; It also stores the app ID in an environment variable named ENTRAID_CLIENT_ID that is used by all scripts that use the “Interactive” parameter, overriding the “PnP Management Shell” app registration that would normally be used.&nbsp; This way, existing scripts will not have to be modified.&nbsp; The new script is called “UserAuthentication.ps1” and will be included in all upcoming releases of PointFire 365 and PointFire Translator, but you can also request it directly from PointFire support.</span></p></div></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 05 Sep 2024 10:37:17 -0400</pubDate></item><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[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[Script Files That Download Rather Than Executing]]></title><link>https://blog.icefire.ca/blogs/post/script-files-that-download-rather-than-executing</link><description><![CDATA[It started with an intermittent problem from a client.&nbsp; In some cases their users were being prompted to download a JavaScript file that had our ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_l6gG25gXQPaH3Mokhe1GqQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_tvoxAHH0Tdq8wLC_dXcAHw" 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_vhb4PF2RR3KR-lPBi-I5Kg" 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_5mvS8KPPSK-g0K5TwCWcaQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_5mvS8KPPSK-g0K5TwCWcaQ"].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;">It started with an intermittent problem from a client.&nbsp; In some cases their users were being prompted to download a JavaScript file that had our product's name somewhere in the file name.</span></p><div style="text-align:left;"><br></div><div><div style="text-align:left;"><span style="font-size:16px;">That file was a localization file that SPFx uses.&nbsp; When you create an SPFx webpart or application customizer, there is a &quot;loc&quot; folder in which you put files that contain the character strings that vary according to language.&nbsp; You can find more details about&nbsp;<a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/guidance/localize-web-parts">SPFx localization here</a>. Each file in that folder will have a name corresponding to the locale, for example &quot;en-us.js&quot; and &quot;fr-fr.js&quot;.&nbsp; These files will then be packaged under a longer name, consisting of</span></div><div style="text-align:left;"><br></div><span style="font-size:16px;"><div style="text-align:left;">(the name in the project)_en-us_(some long hex string).js</div></span></div><div style="text-align:left;"><br></div><div style="text-align:left;"><span style="font-size:16px;">It turns out that this file was the one that was sometimes downloaded. Looking more deeply at why it was being downloaded sometimes when other JavaScript files weren't, it turns out that there was a difference in the http headers that were being sent.</span></div><p><span style="font-size:16px;"><span style="color:inherit;"></span></span></p></div>
</div><div data-element-id="elm_1x8SkOm0X26Np2dhxvbLtw" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_1x8SkOm0X26Np2dhxvbLtw"].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="/HTTP-HEADERS.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_YLiYYo51XOCzGBpokPkBoA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_YLiYYo51XOCzGBpokPkBoA"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div><div><span style="font-size:16px;">The major difference between the .js file that was sometimes being downloaded and the ones that weren't was that the ones being downloaded had a &quot;content-disposition&quot; header and the the others didn't.&nbsp; In theory, a content-disposition of &quot;attachment&quot; with a file name means that this file should be downloaded, not sent to whatever is responsible for the MIME type represented in the Content-Type header.&nbsp; In practice, browsers know that web servers often get the http headers wrong, so they look for other evidence of the intent.&nbsp; Most of the time they look at the content-type and only download the file if its value is &quot;application/octet-stream&quot;.&nbsp; They apparently also look at the context in which is it being called.&nbsp;</span></div><p><span style="color:inherit;font-size:16px;"><br></span></p><div><span style="font-size:16px;">In the case of the client, the download usually came when the user had just logged out and logged back in again.&nbsp; Their authentication was not the usual one, so it involved some redirection to and from their on premise identity management.&nbsp; If the caching of this JavaScript file had expired but other files were in the cache, it could very well be the first file being fetched from the SharePoint Online domain, so no context is available for the browser to take into account.&nbsp; In that case, it seemed, it respected the incorrect Content-Disposition header. Also, they were not using and did not want to use any CDN to serve these files, unlike most of our other clients with a similar architecture.&nbsp; Files served by a CDN tend to have the correct http headers.</span></div><p><br></p><div><span style="font-size:16px;">That behaviour is easily reproduced, by going directly to the appropriate folder of the App Catalog's ClientSideAssets library and clicking on the file name.&nbsp; That file prompted the user to download it, while other .js files in the same folder did not.</span></div><p><span style="color:inherit;font-size:16px;"><br></span></p><div><span style="font-size:16px;">I won't bore you with everything that we tried to figure this out.&nbsp; As some point we were convinced that this happened to with&nbsp;<a href="https://github.com/SharePoint/sp-dev-docs/issues/6302">application customizers but did not happen to webparts</a>.&nbsp; As it turns out, the problem was with our naming convention.&nbsp; using the words &quot;modern application customizer&quot; in the name rather than &quot;modern webpart&quot; made a difference.</span></div><p><span style="color:inherit;font-size:16px;"><br></span></p><div><span style="font-size:16px;">The difference was the name of the JavaScript file, specifically the length of the name.&nbsp; The file name was already pretty long, but the difference between the words &quot;webpart&quot; and &quot;application customizer&quot; took it over some magic threshold.&nbsp; Our naming convention sabotaged the attempt to reproduce the problem with a &quot;hello, world&quot; test.&nbsp; If looks like a file with a name of 81 characters has the correct http header, but one of 87 has the wrong one.&nbsp; I'm still not sure what is the exact limit, and whether it is a limit on the file name or the path or the full URL.&nbsp; None of those lengths seem close to some magic number, but it doesn't matter since shortening the part of the file name that we are responsible for fixes the problem.</span></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 12 Nov 2020 01:11:00 -0500</pubDate></item><item><title><![CDATA[How to make SharePoint API calls language-independent]]></title><link>https://blog.icefire.ca/blogs/post/how-to-make-sharepoint-api-calls-language-independent</link><description><![CDATA[SharePoint's API has gone through several iterations, from the 2010 API, to the 2013 API, and now Graph API.&nbsp; Throughout, it has struggled with b ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_aDzge6l7RBaqQM73cMr8PA" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_CF8HytD-R7-FEa-Nttb2tQ" 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_UoZtCaBKSv-mj1rvdlpaHQ" 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_UoZtCaBKSv-mj1rvdlpaHQ"].zpelem-col{ border-radius:1px; } </style><div data-element-id="elm_xBZC33rtSI25XvDy7ST6xw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_xBZC33rtSI25XvDy7ST6xw"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-center " data-editor="true"><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>SharePoint's API has gone through several iterations, from the 2010 API, to the 2013 API, and now Graph API.&nbsp; Throughout, it has struggled with being language-independent, particularly when dealing with lists and libraries.&nbsp; Everything works fine when the site is in English and the user's language is English, but many things don't work like the examples when the API encounters a different language.&nbsp; If you are writing software, or even a Power Automate flow that uses the API, you need to be conscious of the fact that that the API may stop working if the user is using a different language, or the site was created in a different language.</span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;">Let's use a simple problem to illustrate.&nbsp; Suppose you want to know whether a user is a site administrator.&nbsp; That information is kept in a handy hidden list on the site, called (in English) the User Information List.&nbsp; Let's retrieve that information using the SharePoint 2010 API, the one that starts with &quot;_vti_bin/ListData.svc/&quot;.&nbsp; The REST API call would be:</p><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:14px;">{Site URL}_vti_bin/ListData.svc/UserInformationList(4)/IsSiteAdmin</code></span></p><p style="margin-bottom:15px;font-size:14px;"></p><p style="text-align:left;margin-bottom:15px;font-size:14px;">Here, I am using a &quot;4&quot; to indicate a specific user's ID on this site.&nbsp; This query returns a single line of xml with (in my case) the value &quot;true&quot;.&nbsp; Simple, right?</p><p style="text-align:left;margin-bottom:15px;font-size:14px;">Unfortunately, that only works if the user's current UI language is English.&nbsp; If it's French, that API call fails.&nbsp; Instead you have to use this call&nbsp;</p><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:14px;">_vti_bin/ListData.svc/ListeDInformationsUtilisateur(4)/EstLAdministrateurDuSite</code></span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>This is because the list name and the column name used by the list webservice are localized by the MUI</span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>In Dutch, it's</span>&nbsp;</p><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:14px;">_vti_bin/ListData.svc/LijstMetGebruikersgegevens(4)/IsBeheerderVanDeSite</code></span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>In Hindi,</span>&nbsp;</p><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:14px;">_vti_bin/ListData.svc/<span>उपयोगकर्ताजानकारीसूची(4)/साइटव्यवस्थापनहै</span></code></span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;font-size:14px;"><span>Don't forget to URLencode those Hindi Devanagari characters!</span>&nbsp;</p><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:14px;">_vti_bin/ListData.svc/%E0%A4%89%E0%A4%AA%E0%A4%AF%E0%A5%8B%E0%A4%97%E0%A4%95%E0%A4%B0</code></span></p><div style="text-align:left;font-size:14px;"><code style="background-color:rgb(242, 242, 242);">%E0%A5%8D%E0%A4%A4%E0%A4%BE%E0%A4%9C%E0%A4%BE%E0%A4%A8%E0%A4%95%E0%A4%BE%E0%A4%B0</code></div><div style="text-align:left;font-size:14px;"><code style="background-color:rgb(242, 242, 242);">%E0%A5%80%E0%A4%B8%E0%A5%82%E0%A4%9A%E0%A5%80(4)/%E0%A4%B8%E0%A4%BE%E0%A4%87%E0%A4%9F</code></div><div style="text-align:left;font-size:14px;"><code style="background-color:rgb(242, 242, 242);">%E0%A4%B5%E0%A5%8D%E0%A4%AF%E0%A4%B5%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%BE%E0%A4%AA</code></div><p style="text-align:left;"><span style="color:inherit;background-color:rgb(242, 242, 242);"></span></p><div style="text-align:left;font-size:14px;"><code style="background-color:rgb(242, 242, 242);">%E0%A4%A8%E0%A4%B9%E0%A5%88</code></div><div style="font-size:14px;"><p style="text-align:left;margin-bottom:15px;"><span>&nbsp;(line breaks added for formatting)</span></p><p style="text-align:left;margin-bottom:15px;"><span>All of that means that your code has to be ready with 50 different versions of that API call depending on the language of the end user.</span></p><p style="text-align:left;margin-bottom:15px;">It's a little better when you are using the 2013 API.&nbsp; You still have to give it the list's title, but it's the list's internal name, not the display title for the current language.&nbsp; To get the list, the 2013 API call is&nbsp;</p><code><div style="text-align:left;"><span style="font-family:&quot;Work Sans&quot;, sans-serif;background-color:rgb(242, 242, 242);">/_api/web/lists/getbytitle('&lt;list title&gt;')</span></div></code><p style="text-align:left;margin-bottom:15px;"><span>&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;"><span>Better, right?&nbsp; Unfortunately, the internal name of this and many other standard lists and libraries still depends on the language in which the site has been created.&nbsp; When you create a new site, whether classic or modern, the site has a base language.&nbsp; So if the site was created in English, you can get the information with this call</span>&nbsp;</p><code><div style="text-align:left;"><span style="font-family:&quot;Work Sans&quot;, sans-serif;background-color:rgb(242, 242, 242);">_api/web/lists/getByTitle('User Information List')/items(4)/IsSiteAdmin</span></div></code><p style="text-align:left;margin-bottom:15px;"><span>&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;"><span>That call will work no matter what the user's current language is.&nbsp; But getByTitle() is still not language-independent.&nbsp; Using getByTitle is always a bad idea unless you know that no one is creating sites in other languages, but there aren't a lot of other options.&nbsp; If your site was created in Hindi, the call has to be</span>&nbsp;</p><div style="text-align:left;"><code style="background-color:rgb(242, 242, 242);">_api/web/lists/getByTitle('%E0%A4%89%E0%A4%AA%E0%A4%AF%E0%A5%8B%E0%A4%97%E0%A4%95</code></div><div style="text-align:left;"><code style="background-color:rgb(242, 242, 242);">%E0%A4%B0%E0%A5%8D%E0%A4%A4%E0%A4%BE%20%E0%A4%9C%E0%A4%BE%E0%A4%A8%E0%A4%95%E0%A4%BE</code></div><div style="text-align:left;"><code style="background-color:rgb(242, 242, 242);">%E0%A4%B0%E0%A5%80%20%E0%A4%B8%E0%A5%82%E0%A4%9A%E0%A5%80')/items(4)/IsSiteAdmin</code></div><p style="text-align:left;margin-bottom:15px;"><span>(line breaks added for formatting)&nbsp;</span></p><p style="text-align:left;margin-bottom:15px;"><span>It's only a little better than the 2010 API.&nbsp; The API call depends on the site, not the user, and the &quot;IsSiteAdmin&quot; column is not localized.&nbsp; Why the internal name of a hidden list, something that only programmers will ever see, is localized is anybody's guess. &nbsp;So compared to the 2010 API, you're not much better off.&nbsp; You still need to have 50 different versions of the API call, even though it's based on the site language and not the user language.</span></p></div></div>
</div><div data-element-id="elm_erPvomPMzAKf8jIfjlZrCg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_erPvomPMzAKf8jIfjlZrCg"].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="/ENTITYTYPENAME2.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_Cyac41sj5BB0BiXmGhyHoQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_Cyac41sj5BB0BiXmGhyHoQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p style="margin-bottom:15px;"><span>How do you make the API call independent of language?&nbsp; One way is to find the list using another characteristic that is not language-dependent. One such characteristic is the EntityTypeName, essentially the template for the list or library.&nbsp; There will only be one User Information List per site, and its Entity Type is &quot;UserInfo&quot;.&nbsp; There could be several pages libraries, but there typically is only one, similarly for Site Assets and so forth.&nbsp; So the trick it to find the list using an OData filter like&nbsp;</span></p><p><span style="color:inherit;font-size:16px;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">/_api/web/lists?$filter=EntityTypeName%20eq%20%27UserInfo%27</code></span></p><p style="margin-bottom:15px;"><span>&nbsp;</span></p><p style="margin-bottom:15px;"><span>and use the result to retrieve the list Id, which is a GUID, and then use that GUID to retrieve the information from the list, for example&nbsp;</span></p><p><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">_api/web/lists('0040809f-5e97-4920-9068-0b36e2aa4b16')/items(4)/IsSiteAdmin</code></span></p><p style="margin-bottom:15px;"><span>&nbsp;</span></p><p style="margin-bottom:15px;"><span>That's two API calls rather than just one, which is unfortunate if you're trying to cut down on queries, but at least you don't have to code 50 different possibilities.</span></p><p style="margin-bottom:15px;"><span>For this specific list, the User Information List, there is also a second solution.&nbsp; It's based on the fact that this particular list also has a fixed URL that does not include the list name, at &quot;_catalogs/users/detail.aspx&quot;.&nbsp; We use this trick to retrieve the list by URL, using the less well known GetList method.&nbsp; On my ”/sites/Hi” Hindi site, the API call could be</span></p><p><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">_api/web/GetList(@listUrl)/?@listUrl=%27%2Fsites%2FHi%2F_catalogs%2Fusers%2Fdetail.aspx%27&amp;FilterField1=ID&amp;FilterValue1=4</code></span></p><p style="margin-bottom:15px;"><span>&nbsp;</span></p><p style="margin-bottom:15px;"><span>Neither of those tricks is completely general for all lists and libraries, but I haven't found one that applies in every case.</span></p><p style="margin-bottom:15px;"><span>How about the Graph API?&nbsp; The Graph API suffers from the same problems as the 2013 API, but does not support the same solutions to those problems.&nbsp; So for instance after you retrieve the Site ID, you can use it to retrieve the list by name in the same way as for the 2013 API.&nbsp; If the site is in English, it would be</span></p><p><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">https://graph.microsoft.com/v1.0/sites/{Site ID}/lists('User Information List')</code></span></p><p style="margin-bottom:15px;"><span><br></span></p><p style="margin-bottom:15px;"><span>If it’s in Hindi, you would have to use</span></p><p><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">https://graph.microsoft.com/v1.0/sites/{Site ID}/lists('उपयोगकर्ता&nbsp;जानकारी&nbsp;सूची')</code></span></p><p style="margin-bottom:15px;"><span><br></span></p><p style="margin-bottom:15px;"><span>or you can use</span></p><p><span style="color:inherit;background-color:rgb(242, 242, 242);"><code style="font-size:12.6px;">lists?$filter=displayName eq 'उपयोगकर्ता&nbsp;जानकारी&nbsp;सूची</code>'</span><br></p></div>
</div><div data-element-id="elm_BcAO0RfN0OD4mcyLJKVA6A" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_BcAO0RfN0OD4mcyLJKVA6A"].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="/GRAPH.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_fct1x4iKxOeZJsT8623qUQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_fct1x4iKxOeZJsT8623qUQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">I have not yet succeeded in getting it to filter by EntityTypeName (Graph API&nbsp; calls it “list/template”) or by URL, or even to find the isSiteAdmin property.&nbsp; I have only succeeded in collecting an impressive set of OData filter expressions that aren't supported, so I'm afraid I don't yet have a good solution for the Graph API.&nbsp; Maybe someone more clever than me will find one.</span><br></p></div>
</div><div data-element-id="elm_La2u8RyNtKNdlxOseDDT1g" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_La2u8RyNtKNdlxOseDDT1g"].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="/FILTER.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Sun, 20 Sep 2020 04:09:00 -0400</pubDate></item><item><title><![CDATA[SharePoint 2019 Machine Translation Service is back!]]></title><link>https://blog.icefire.ca/blogs/post/sharepoint-2019-machine-translation-service-is-back</link><description><![CDATA[When SharePoint 2019 was first released, its Machine Translation Service did not work.&nbsp; The service could be installed and was running, but most ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_Fj89XjIpSP6Xc0sh366JFw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_USRsuc9qTGm4JLBolCnTMg" 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_jVK81hevS6SrW974QMLWmQ" 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_l-45i40uTtaoWYEES-_9pA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_l-45i40uTtaoWYEES-_9pA"].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;">When SharePoint 2019 was first released, its Machine Translation Service did not work.&nbsp; The service could be installed and was running, but most attempts to use of it would result in the error message&nbsp;&quot;<i style="font-size:14px;">The service application required to complete this request is unavailable. Try this operation again later. If the problem persists, contact your administrator.</i>&quot;</span></p><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">The ULS log would have a message of &quot;<i>Unimplemented method</i>&quot; with a stack trace in Microsoft.Office.Web.Conversion.Framework.</span></div><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">Microsoft&nbsp; has now resolved that error!&nbsp; If you install the July 2020 or later&nbsp;<a href="https://docs.microsoft.com/en-us/officeupdates/sharepoint-updates#sharepoint-2019-update-history">Cumulative Update for SharePoint 2019</a>&nbsp;then the service is working again.</span></div><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;">The Machine Translation Service is used by two optional features of PointFire 2019: the machine translation of user interface elements and the translation of classic pages and documents in SharePoint libraries.</span></div></div>
</div><div data-element-id="elm_2CIIZdn9BNVNnwdTI78VOg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_2CIIZdn9BNVNnwdTI78VOg"].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="/MTS123.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_PEU-Y8hzmNdo7PR6lZimqg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_PEU-Y8hzmNdo7PR6lZimqg"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="font-size:14px;"><div><div><span style="font-size:16px;">These functions now work as expected.&nbsp; The next release of PointFire 2019 will have some performance improvements that were delayed because of the difficulty in testing improvements to a feature that very few could use.</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">Because of the ongoing problem, all users of PointFire 2019 have been able to get free annual licenses for PointFire Translator, which can translate documents, pages, lists, and UI elements in SharePoint 2019 with higher quality than the free Machine Translation Service (although check out this&nbsp;<a href="http://blog.icefire.ca/post/little-known-setting-to-vastly-improve-translation-quality">secret setting</a>).&nbsp; PointFire Translator can also translate modern pages Excel, PowerPoint, and PDFs, which the Machine Translation Service cannot do, and covers more languages.&nbsp; This free license program will soon end. If your free PointFire Translator license is expiring, contact us about transitioning to the Machine Translation Service or renewing the license.</span></div></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Thu, 13 Aug 2020 03:08:00 -0400</pubDate></item><item><title><![CDATA[SharePoint Multilingual Page Publishing Feature in Detail]]></title><link>https://blog.icefire.ca/blogs/post/sharepoint-multilingual-page-publishing-feature-in-detail</link><description><![CDATA[The new multilingual page publishing feature for Modern sites is now available in Targeted Release.&nbsp; This is a good time to go through its main f ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_hJZtqwDGQuiMlbfw-bfgfQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_mG8KkA34QC6TY_QUg3FJqQ" 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_RXBJWYQpQMSr5IunENSphw" 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_5caucKadTVinNTTNjPwWuw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_5caucKadTVinNTTNjPwWuw"].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;">The new multilingual page publishing feature for Modern sites is now available in Targeted Release.&nbsp; This is a good time to go through its main features in a bit more detail.<br></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;">This SharePoint Online feature enables the publishing and consumption of pages and news in multiple languages in a modern SharePoint communication site. Multi-lingual page publishing means that on modern communication sites, site owners can determine in what languages they want to translate individual pages and news posts. This is different from Variations in that the translated pages are on the same multilingual site, but similar in that it copies pages and you have to translate them to the other language.</span></p></div>
</div><div data-element-id="elm_7pQZOqBJDw-jBwNC7EgeSA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_7pQZOqBJDw-jBwNC7EgeSA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><span style="font-weight:700;font-size:20px;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);">Turning it on</span><br></h2></div>
<div data-element-id="elm_ptTUPWolljc-BK2TS8le7A" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ptTUPWolljc-BK2TS8le7A"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">This feature must be turned on before it has any effect.&nbsp; The activation is not, as you might think, in the site features section, but in Language settings.</span><br></p></div>
</div><div data-element-id="elm_hdI1C1X13-4_HX9RaB-0KA" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_hdI1C1X13-4_HX9RaB-0KA"].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="/SETTINGS1.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_IlW9_WBqVXJR7PGIfZ9r9g" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_IlW9_WBqVXJR7PGIfZ9r9g"].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;">Language settings was there before, this is where you used to set the Alternate languages for a site.&nbsp; You can still do that more or less like before if you don't turn the feature on, by clicking on &quot;Show advanced settings&quot;</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">The new option is called &quot;Enable pages and news to be translated into multiple languages&quot;</span></p></div>
</div><div data-element-id="elm_3jVdRa1voVu5FpWzqPjuVA" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_3jVdRa1voVu5FpWzqPjuVA"].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="/SETTINGS2.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_1oDPFqEytePdPrlNo4ncTQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_1oDPFqEytePdPrlNo4ncTQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">The switch to turn on that feature appears on Communication sites, either new ones or existing ones.&nbsp; It does not appear on Classic sites and it does not even appear on Modern Team sites.</span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">If you click on &quot;Show advanced settings&quot; without enabling the feature, you can pick the list of alternate languages like before, and like before they are all turned on by default.</span></p></div>
</div><div data-element-id="elm_drGC-ULLiV1kO2ucMTaHOg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_drGC-ULLiV1kO2ucMTaHOg"].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="/SETTINGS3.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_JQBazKNyhpRo1ZwlNew3lQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_JQBazKNyhpRo1ZwlNew3lQ"].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;">Parenthesis, what is Overwrite translations at the bottom?&nbsp; It’s the same as before, with a different wording.&nbsp; It has to do with what happens when you change MUI-enabled text in the site default language when it has has already been translated, will it leave the translations alone, or will it overwrite them with the new text in the original language as an indication that they need to be re-translated.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">The second that you turn on the feature, even if you immediately turn it off again, all the site alternate&nbsp;languages are unselected.&nbsp; You have to turn them on again one by one, using a different interface if the feature is activated.</span></div></div>
</div><div data-element-id="elm_A294yUGvMz8ePu0mNCX7nQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_A294yUGvMz8ePu0mNCX7nQ"].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="/SETTINGS4.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_o1muap8fZmNUESmLSlgpnw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_o1muap8fZmNUESmLSlgpnw"].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 list of languages is the same as it was before with one exception, Serbian (Latin) has been dropped.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">To select alternate languages, you can type a few letters of the language name or select it from the dropdown list.</span></p></div>
</div><div data-element-id="elm_Elgz-JEp7VwGmhuWAxkq-g" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_Elgz-JEp7VwGmhuWAxkq-g"].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="/SETTINGS5.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_KG4S6_hj56_oga2fndQBGw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_KG4S6_hj56_oga2fndQBGw"].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;">Selecting a language has two effects: it adds it to the list of alternate languages which determines the languages supported by the multilingual user interface (MUI), and it adds it to the list of languages to which site pages can be translated.</span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">For each language you can select one or more &quot;translator&quot;.&nbsp; These are accounts that are notified by email whenever a page on this site should be translated to that language.&nbsp; Naming someone as the translator does not give them rights to edit the pages, it simply sends them the email that contains a link to the page.&nbsp; It is possible to send the email to external users, and it is possible to send it to people with no&nbsp;access to the list or to the site.&nbsp; Sending it to a group works as well.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">However if you type an email that’s not in AAD, then it gives a message when you save “Can’t save setting now.&nbsp; Try again later”.&nbsp; Always remember to hit save.</span></p></div>
</div><div data-element-id="elm_hQXLanga7ZeUD-QZ3OxyiQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_hQXLanga7ZeUD-QZ3OxyiQ"].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="/SETTINGS6.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_UCiDZYeKL0nxzDAR4znESQ" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_UCiDZYeKL0nxzDAR4znESQ"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">Adding pages</span></p></h2></div>
<div data-element-id="elm_ZtY-DafgySM3WBvrJEohyw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ZtY-DafgySM3WBvrJEohyw"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">Since this is a Communication site, pages in the site default language can be added to the Site Pages library like before using Add a Page or by creating a News post.&nbsp; Jumping ahead, creating a page, even with a different language selected,&nbsp;or using a language-specific News web part will always create pages that are assumed to be in the site default language and are in the root directory of the Site Pages library.&nbsp;</span></p><div><span style="font-size:14px;"><br></span></div></div>
</div><div data-element-id="elm_MeGwNQWEDsxtyyFqGmlq6A" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_MeGwNQWEDsxtyyFqGmlq6A"].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="/PAGE.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_cx-a1pDEybXJuv2LShwHpA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_cx-a1pDEybXJuv2LShwHpA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">&quot;Translate&quot; pages</span></p></h2></div>
<div data-element-id="elm__pGUAHeKFft7DYb1sBcUoQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm__pGUAHeKFft7DYb1sBcUoQ"].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;">You notice in the page menu bar that there is a &quot;translation&quot; button.&nbsp; This will open a translation pane on the right.</span></p><p><span style="font-size:16px;"><span style="color:inherit;"></span></span></p></div>
</div><div data-element-id="elm_J_Ts5ESE8LIDW1E6WxbZwQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_J_Ts5ESE8LIDW1E6WxbZwQ"].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="/PANE1.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_vxzaqqzUd36yvP0j6Q2tog" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_vxzaqqzUd36yvP0j6Q2tog"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="text-align:center;"><div style="text-align:left;"><span style="font-size:16px;">As it clearly explains, this does not actually translate (unless you have&nbsp;<a href="http://pointfire.com/features/pointfire%2Bpower%2Btranslator/">PointFire Translator</a>), it creates a nearly exact copy of the page either in all languages or in one language at a time.&nbsp; You can do this with a draft or a published version, but keep in mind who can and cannot see drafts.&nbsp; If you do not create them all at once, you can create the others individually or for all remaining languages at once.</span></div></div></div>
</div><div data-element-id="elm_ne3K9aux-8hnx62vAndQ6A" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_ne3K9aux-8hnx62vAndQ6A"].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="/PANE3.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_iYe5fRWz8c4RgN374WT6Rg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_iYe5fRWz8c4RgN374WT6Rg"].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;">All created pages are drafts initially.&nbsp; It is then possible to get to that page in at least four ways.</span></div><div style="text-align:center;"><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">1) Follow the &quot;view&quot; link</span></div></div></div>
</div><div data-element-id="elm_zZISpziDHP5vgqjOnq_C8w" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_zZISpziDHP5vgqjOnq_C8w"].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="/PANE2.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_PnRngX0BDJVJqL1nwcXBrg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_PnRngX0BDJVJqL1nwcXBrg"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">2) Follow the email link in the email that is sent to translators when the page is created</span><br></p></div>
</div><div data-element-id="elm_0YrHPz29tTiM6rzrdk0gew" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_0YrHPz29tTiM6rzrdk0gew"].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="/EMAIL%20-1-.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_d48sVBavCoUTPDXMgHldoA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_d48sVBavCoUTPDXMgHldoA"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div>3) follow the little &quot;Available languages&quot; page navigation dropdown in the top right corner</div></div>
</div><div data-element-id="elm_-OpQsFXVQN2OsOCj2sZbkg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_-OpQsFXVQN2OsOCj2sZbkg"].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="/MENU.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_y5-BdmN2LfUjPGEYKS96UQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_y5-BdmN2LfUjPGEYKS96UQ"].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;">Notice how this page navigation reminds you which page is published and which is a draft.</span></div><div style="text-align:center;"><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">4) Navigating to the folder</span></div></div></div>
</div><div data-element-id="elm_5RV50qb06tSgEsXxTvPOeg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_5RV50qb06tSgEsXxTvPOeg"].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="/FOLDERS2.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_0Zw-K5wJ9IkmnAQG0CcEnA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_0Zw-K5wJ9IkmnAQG0CcEnA"].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;">When a translation page is created, it is put in a language-specific folder, with the same file name.&nbsp; These folders use the PointFire naming convention, a two-letter code for languages where SharePoint supports only one variant, and language-dash-country or language-dash-script where there are more variants.</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">When you first visit the language-specific copy, you will notice that the title is changed to “Translate into {Language name}: {Original title}”.&nbsp; You will also notice a message at the top, &quot;This page has not been translated into {Language name} yet.&nbsp; Edit to start translation&quot;.</span></div></div></div>
</div><div data-element-id="elm_gJubnonaHTV3y5S21tTQIg" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_gJubnonaHTV3y5S21tTQIg"].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="/PAGE3.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_E63zqUj2IxS_7qBD9WA5YA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_E63zqUj2IxS_7qBD9WA5YA"].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 message remains until the page has been Saved once, even if you went in edit mode and changed nothing and it autosaved.&nbsp; You (or someone else) are responsible for translating the content of the page, its title and the title and content of every webpart.&nbsp; Remind translators to delete, not translate, the “Translate into {Language name}: ” part of the title.</span></p><p><span style="font-size:16px;"><span style="color:inherit;"></span></span></p></div>
</div><div data-element-id="elm_cvJkrVHYLd2eVT9kzmvKCw" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_cvJkrVHYLd2eVT9kzmvKCw"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">User Language and Issue with Right-to-Left languages</span></p></h2></div>
<div data-element-id="elm_hK-rcFKO-JcDq226JEBRTQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_hK-rcFKO-JcDq226JEBRTQ"].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;">Depending on the&nbsp;<a href="http://blog.icefire.ca/post/sharepoint-online-language-settings-and-the-instant-toggle-trick">user's SharePoint language</a>, there is a possibility of the user being redirected to the version of the same page in the user's language.&nbsp; This redirection is not persistent, it is easy to navigate to pages in other languages without changing your own language.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">When you go to a page in a right-to-left language while your current language is one that has left-to-right layout, you will see it with a left-to-right layout while editing.&nbsp; The letters are RTL but the layout is LTR.</span></p></div>
</div><div data-element-id="elm_cMPEQ2I9nozRPp2AkWgp8A" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_cMPEQ2I9nozRPp2AkWgp8A"].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="/RTL2.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_deQvyLlbMBAQilFVGP3Zsg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_deQvyLlbMBAQilFVGP3Zsg"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">If your current language is a right-to-left one, then you will see a right-to-left layout.&nbsp; The layout depends on the user’s language, not the language of the page or of the site.&nbsp; &nbsp;For those interested in the technical details, the&nbsp;<a href="http://blog.icefire.ca/post/how-to-achieve-language-specific-styling-in-modern-pages">&quot;lang&quot; and &quot;dir&quot; properties of the page's html element</a>&nbsp;follow the user language settings.</span><br></p></div>
</div><div data-element-id="elm_H5zAwoEUdQKcZHg2uv1d6A" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_H5zAwoEUdQKcZHg2uv1d6A"].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="/RTL1.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_37VlGwy-zZwjHymNfRWKew" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_37VlGwy-zZwjHymNfRWKew"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div><div><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">Language of the user interface</span></div></div></h2></div>
<div data-element-id="elm_dE0L7W_eGQGOyb2AwzwzIQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_dE0L7W_eGQGOyb2AwzwzIQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div style="font-size:14px;"></div><div style="font-size:14px;"><span style="font-size:16px;">This may be a good time to point out that while the feature will let you translate and navigate to pages in other languages, what you will see is only the page content in that language, the entire user interface will not switch to that language.&nbsp; That's why in the first Arabic picture above you see the UI in one language and the content in the other language.&nbsp; In the second Arabic picture, the content language and the UI language match, because the user's language setting matches the page language.&nbsp;<a href="http://pointfire.com/HowTo/ChangeLanguage/">Changing your own SharePoint language</a>&nbsp;is no easy feat.</span></div><div style="font-size:14px;"><br></div><div><span style="font-size:16px;">Does this feature translate the UI?&nbsp; No.&nbsp; There are a number of UI elements that support MUI, and out-of-the-box elements are mostly populated with localized elements, but any customization that you do, for example to the navigation, will not be translated unless you translate it manually.&nbsp; Here is&nbsp;<a href="http://pointfire.com/HowTo/LocalizeNavigation/">how to localize your SharePoint navigation</a>, but the same technique should be used for all localizable UI elements, including title/description of sites, lists, columns, content types, and views.</span></div><div style="font-size:14px;"><br></div><div><span style="font-size:16px;">Can you translate custom SPFx web parts?&nbsp; Almost never.&nbsp; Whoever developed the webpart might have given you the ability to change certain strings on the page, but developers should probably also follow the&nbsp;<a href="https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-parts/guidance/localize-web-parts">guidance to localize the webpart</a>.&nbsp; This localization will follow the user's language, not the page or site language.</span></div></div>
</div><div data-element-id="elm_FGbJr2yflX-V98SkvpP6pA" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_FGbJr2yflX-V98SkvpP6pA"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><p style="margin-bottom:15px;"><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">Deleting pages</span></p></h2></div>
<div data-element-id="elm_xVpYkkl8CubRqgDKFwlhVw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_xVpYkkl8CubRqgDKFwlhVw"].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;">What if you make a change to the original page?&nbsp; Can you re-copy it to the translations? No (again, unless you have PointFire Translator).&nbsp; However now is a good time for human translators to discover the new&nbsp;<a href="https://www.microsoft.com/en-us/microsoft-365/roadmap?featureid=57813">SharePoint page version comparison feature</a>&nbsp;to&nbsp;<a href="https://support.office.com/en-us/article/compare-page-versions-in-sharepoint-de7ba69d-257d-4201-b787-d5ea89fb2f08">highlight what has changed</a>&nbsp;and determine what need to be re-translated.</span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">It won’t re-copy unless you delete the translated copy.&nbsp; The feature adapts well to deleting the translated copy. The “Available languages”&nbsp;menu adapts, as does the translation pane.</span></p><p><span style="color:inherit;font-size:16px;"></span></p><p style="margin-bottom:15px;"><span style="font-size:16px;">If you delete the original, the copies stay.&nbsp; However they feel some distress.&nbsp; If you click on the “Available languages” menu while on one of the orphaned copies, it spins and never returns.</span></p></div>
</div><div data-element-id="elm_hufiVDxpKCxQVvuBkWmlcA" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_hufiVDxpKCxQVvuBkWmlcA"].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="/DISTRESS.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_ugjjDQnxmeL8qhMuuTRoYg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_ugjjDQnxmeL8qhMuuTRoYg"].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;">f you turn off the feature, all the pages stay, but most of the language functionality is removed.&nbsp; The functionality returns if the feature is turned back on again.</span></p><p><span style="font-size:16px;"><span style="color:inherit;"></span></span></p></div>
</div><div data-element-id="elm_BVNSKPr8fWNBj3-49TEmjg" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_BVNSKPr8fWNBj3-49TEmjg"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><p style="margin-bottom:15px;font-size:14px;"><span style="color:inherit;">&nbsp;</span><span style="font-weight:700;color:rgb(11, 27, 45);font-size:20px;">News Webpart language filtering</span></p></h2></div>
<div data-element-id="elm_tQF73umC_tKJ12EKmiWmCA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_tQF73umC_tKJ12EKmiWmCA"].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;">One cool automatic feature I'm still trying to find the limits of is the filtering of News and Highlighted Content webparts by language.&nbsp; If you have a News webpart on a default language page, it will only show published news items that are in the default language.&nbsp; However if that same webpart is on a translated language page, the webpart only&nbsp;shows published news items that are in that language.&nbsp; The filtering is automatic, there are no explicit filter conditions that are added or can be modified.&nbsp; If you turn off the feature, then the filtering stops.&nbsp; Does it work with Hub news or on the SharePoint home page?&nbsp; Stay tuned, not certain yet.</span></p><p><span style="font-size:16px;"><span style="color:inherit;"></span></span></p></div>
</div><div data-element-id="elm_FzYpDBs5T5pR-I5twWCEVg" data-element-type="heading" class="zpelement zpelem-heading "><style> [data-element-id="elm_FzYpDBs5T5pR-I5twWCEVg"].zpelem-heading { border-radius:1px; } </style><h2
 class="zpheading zpheading-style-none zpheading-align-left " data-editor="true"><div style="font-size:14px;"><p style="margin-bottom:15px;"><span style="font-weight:700;font-family:&quot;Work Sans&quot;;color:rgb(11, 27, 45);font-size:20px;">How PointFire Translator completes the functionality</span></p></div></h2></div>
<div data-element-id="elm_MtGpj-DzV-rrM-CogmA0yA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_MtGpj-DzV-rrM-CogmA0yA"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">For more details see the blog post about&nbsp;<a href="http://blog.icefire.ca/post/sharepoint-s-new-multilingual-publishing-feature-and-how-pointfire-integrates-with-it">machine translation for multilingual page publishing</a>.&nbsp; Here is a video that shows how this automatic machine translation works.</span><br></p></div>
</div><div data-element-id="elm_uhGmWxHuAzDAjgrg89yTjQ" data-element-type="video" class="zpelement zpelem-video "><style type="text/css"> [data-element-id="elm_uhGmWxHuAzDAjgrg89yTjQ"].zpelem-video{ border-radius:1px; } </style><div class="zpvideo-container zpiframe-align-left zpiframe-mobile-align- zpiframe-tablet-align-"><iframe class="zpvideo " width="560" height="315" src="//www.youtube.com/embed/ETRExptNo2k" frameborder="0" allowfullscreen></iframe></div>
</div><div data-element-id="elm_delCHB6QUMWCdLOOdWjP7Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_delCHB6QUMWCdLOOdWjP7Q"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">Essentially, the machine translation process can be completely automated.&nbsp; When you view the new page for the first time, what you will see is not a copy of the original page for you to manually translate, but a translated page for you to approve and publish.&nbsp; This saves huge amounts of time and money.</span><br></p></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 17 Mar 2020 08:03:00 -0400</pubDate></item><item><title><![CDATA[It's official, Variations are a deprecated feature]]></title><link>https://blog.icefire.ca/blogs/post/it-s-official-variations-are-a-deprecated-feature</link><description><![CDATA[<img align="left" hspace="5" src="https://blog.icefire.ca/DEPRECATED.png"/>SharePoint 2019 public preview &nbsp;is out! It brings most of the SharePoint Online experience to the on-premise environment.&nbsp; But as a follow-up ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_cgGJ-xN9RGqpUtC96vaIHQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_1Etk5A9QQNe6gsiitT1rOQ" 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_viK68fZ3S2SYdFIS8rhsxQ" 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_L-Oog13-Qr28cieul2Y2qA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_L-Oog13-Qr28cieul2Y2qA"].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;"><a href="https://blogs.technet.microsoft.com/christianheim/2018/07/24/sharepoint-2019-public-preview-generally-available/">SharePoint 2019 public preview</a>&nbsp;is out!</span></p><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">It brings most of the SharePoint Online experience to the on-premise environment.&nbsp; But as a follow-up to the announcement 4 weeks ago about the&nbsp;<a href="http://blog.icefire.ca/post/machine-translation-service-variations-are-on-the-way-out">retirement of the machine translation service and possible end of Variations</a>, in SharePoint 2019 the list of deprecated features includes this:</span></div><p></p><div style="font-size:14px;"><div style="text-align:left;"><span style="font-weight:700;font-size:16px;"><span></span>Machine Translations (and Variations)</span></div><div style="text-align:left;"><span style="font-size:16px;">The Machine Translation Service will remain supported, but deprecated, for the SharePoint Server 2019 Public Preview release.</span></div></div></div>
</div><div data-element-id="elm_M6NkhohT16Er71erANpEsQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_M6NkhohT16Er71erANpEsQ"].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="/DEPRECATED.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_94TEHDj9V2s-8PRI-hsoRw" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_94TEHDj9V2s-8PRI-hsoRw"].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;">This is the second shoe to drop from the Variations centipede.&nbsp; This means that the Machine Translation Service is still there in SharePoint 2019 and they will repair it if it breaks, but no new features will be developed.&nbsp; Among the features that will not be developed is the ability for modern sites to participate in Variations, and for modern pages to be translated using the Machine Translation Service.&nbsp; And since &quot;<a href="http://hwcdn.libsyn.com/p/9/b/2/9b2cb09af1330670/The_Intrazone_SharePoint_Podcast_EP008_Transcript.pdf?c_id=21991008&cs_id=21991008&destination_id=680177&expiration=1532527842&hwt=3e142439d94a53e3775c12a9373cb50d">Classic is dead like Latin</a>&quot; you can expect all new features to be produced as Modern pages and to have less and less of SharePoint supported by Variations before the plug is finally pulled.</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">Some people are saying Microsoft wouldn't drop these essential features without a replacement.&nbsp; The SharePoint&nbsp;2019 announcement does not suggest any alternative for those that need the feature.&nbsp; The&nbsp;<a href="http://blog.icefire.ca/post/machine-translation-service-variations-are-on-the-way-out">SharePoint Online deprecation announcement</a>&nbsp;does suggest investigating the Bing translation APIs, but that suggestion simply will not work.&nbsp;I will spare you the obligatory ad, you know where to find the one alternative to Variations</span></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 24 Jul 2018 18:07:00 -0400</pubDate></item><item><title><![CDATA[Do Hub sites support MUI?]]></title><link>https://blog.icefire.ca/blogs/post/do-hub-sites-support-mui</link><description><![CDATA[Spoiler: they do in part, but very very slowly. SharePoint Online Targeted Release tenants are starting to get the&nbsp; new Hub Sites &nbsp;that were pr ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_jcs81rWaSCiy8Xt49MnkDQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_kclDKvyFSlySbS_kTzb58Q" 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_umCRFj4HRq-9heB7Ob9uvw" 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_cTH5zlb3Q8mNtJTFkcsK-Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_cTH5zlb3Q8mNtJTFkcsK-Q"].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;">Spoiler: they do in part, but very very slowly.</span></p><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">SharePoint Online Targeted Release tenants are starting to get the&nbsp;<a href="https://techcommunity.microsoft.com/t5/SharePoint-Blog/Organize-your-intranet-with-SharePoint-hub-sites/ba-p/174081">new Hub Sites</a>&nbsp;that were promised last September.</span></div><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">Hub sites are a way to organize different sites together, without a site hierarchy.&nbsp; Hub sites are just ordinary sites, typically communication sites, that are designated as hubs.&nbsp; You can read about search, rollup and inherited theme elements elsewhere.&nbsp; For the purpose of MUI, what is important is that Hubs have an extra navigation menu, and this navigation menu is inherited by all the sites that are associated with the hub.</span></div><div style="text-align:left;font-size:14px;"><br></div><div style="text-align:left;"><span style="font-size:16px;">Sites that are associated with the Hub, let's call them Spokes, will get this extra navigation menu, but do not have the ability to edit this menu, only the Hub site can edit it.</span></div><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;">The Hub navigation menu consists of two parts:&nbsp; the&nbsp;Hub site display name and the navigation links.</span></div></div>
</div><div data-element-id="elm_HY3lLt-HKYT222vl54_9HA" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_HY3lLt-HKYT222vl54_9HA"].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="/HUBSETTINGS-DISPLAYNAME2.png" size="fit" data-lightbox="true" style="width:100%;padding:0px;margin:0px;"/></picture></span></figure></div>
</div><div data-element-id="elm_WLMMJa9iBXkLz1D0dANX5Q" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_WLMMJa9iBXkLz1D0dANX5Q"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><div><div><span style="font-size:16px;">The hub site display name defaults to the name of the hub site, but it can be changed by going to the Hub site settings in the gear menu.&nbsp; Now the bad news: the display name does not support MUI.&nbsp; It is invariant.</span></div><div><span style="font-size:16px;"><br></span></div><div><span style="font-size:16px;">The navigation links can be edited on the Hub site by clicking on &quot;Edit&quot;</span></div></div></div>
</div><div data-element-id="elm_c8Abwt_GCn8V9q_dfS85Rw" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_c8Abwt_GCn8V9q_dfS85Rw"].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="/files/HUBNAV.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_e55Tk9L4iwfQ8_34-qGscA" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_e55Tk9L4iwfQ8_34-qGscA"].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;">This is a multilevel menu, and is similar to other navigation menus on modern sites.&nbsp; And like other navigation menus, this one is MUI enabled.&nbsp; You can change your language and change the text of the the navigation menu in that language.</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><span style="font-size:16px;">However this menu is more aggressively cached than other menus.&nbsp; If you change your language preference, it can be quite a while before you see the correct language version of the hub navigation menu appear on the Hub site itself, and don't expect to see it appear on Spoke sites until the next day.</span></div></div></div>
</div><div data-element-id="elm_2FdIFmQYlH0pvcvBSplpBQ" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_2FdIFmQYlH0pvcvBSplpBQ"].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="/HUBNAVFR.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_PR3gSxVFkPIhR5ySWBgubQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_PR3gSxVFkPIhR5ySWBgubQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">In fact, in the course of testing this, it fails to load the correct language version of the menu more often than not, even on the next day.&nbsp; I will update this post if I figure out the pattern when it succeeds and when it fails.</span><br></p></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 28 Mar 2018 01:03:00 -0400</pubDate></item><item><title><![CDATA[PointFire 365 v2.0 is released]]></title><link>https://blog.icefire.ca/blogs/post/pointfire-365-v2-0-is-released</link><description><![CDATA[Nearly 3 years ago, we put together a roadmap for what we wanted to see in a SharePoint Online version of PointFire.&nbsp; Today, we deliver the last ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_iyAc64qfRZeQphyHMbnb3A" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_XT6eildyQ_6YzY9y5OQqgg" 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_0jOoT6pHRSW04K2JhzY97w" 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_Fc5bxYlxQAa0ov9vmIL1NQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_Fc5bxYlxQAa0ov9vmIL1NQ"].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;">Nearly 3 years ago, we put together a roadmap for what we wanted to see in a SharePoint Online version of PointFire.&nbsp; Today, we deliver the last of the features on that original roadmap.</span></p><div style="text-align:left;font-size:14px;"><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><div style="text-align:left;"><span style="font-size:16px;">At the time of the original roadmap, several of the features were technically impossible.&nbsp; Today, some of the features are still impossible, but we implemented them anyway.&nbsp; The software changes the time zone over and over until it time travels to when Microsoft supports these functions.</span></div><div style="text-align:left;"><span style="font-size:16px;"><br></span></div><span style="font-size:16px;"><div style="text-align:left;">As SharePoint Online expanded its programmability, more and more became possible, and after a few false starts and several months of beta testing, version 1.0 came out over a year ago.&nbsp; It was only the major features and some were slow or limited, but it found several takers.&nbsp; Versions 1.1 and 1.2 covered more and more ground.</div></span></div></div>
</div><div data-element-id="elm_e3iBNPqNAT7Pd2HReG6Q2Q" data-element-type="video" class="zpelement zpelem-video "><style type="text/css"> [data-element-id="elm_e3iBNPqNAT7Pd2HReG6Q2Q"].zpelem-video{ border-radius:1px; } </style><div class="zpvideo-container zpiframe-align-left zpiframe-mobile-align- zpiframe-tablet-align-"><iframe class="zpvideo " width="560" height="315" src="//www.youtube.com/embed/7NM_gDpIixQ" frameborder="0" allowfullscreen></iframe></div>
</div><div data-element-id="elm_VZGHj_47NAcRlYJcu9dbbQ" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_VZGHj_47NAcRlYJcu9dbbQ"].zpelem-text { border-radius:1px; } </style><div class="zptext zptext-align-left " data-editor="true"><p><span style="color:inherit;font-size:16px;">Version 2.0 has several major new features.&nbsp; One of them is the instant language toggle.&nbsp; This is one of the impossible features.&nbsp; It is not possible to change your language quickly, it should take a few minutes for the language change to take effect. But PointFire has a little spinner animation that implants a hypnotic suggestion that the language has already changed.&nbsp; It won't work if you don't stare at the spinner animation but no one can help it.<br style="font-size:14px;"><br style="font-size:14px;">Another feature is a rich set of PowerShell scripts to provision and manage PointFire features.&nbsp; PointFire is an enterprise solution, and entreprise solutions need this.<br style="font-size:14px;"><br style="font-size:14px;">The big new feature is translation of the user interface.&nbsp; It's as simple as 1, 2, 3.</span><br></p></div>
</div><div data-element-id="elm_6MF4r0KghUoFdBT60rlVsA" data-element-type="image" class="zpelement zpelem-image "><style> [data-element-id="elm_6MF4r0KghUoFdBT60rlVsA"].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="/Pointfire-translation.png" size="original" data-lightbox="true"/></picture></span></figure></div>
</div><div data-element-id="elm_-ckwLKwjl5Mrwrh6R-JvWg" data-element-type="text" class="zpelement zpelem-text "><style> [data-element-id="elm_-ckwLKwjl5Mrwrh6R-JvWg"].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;">1) Scour the site for translatable text elements and puts them into the Multilingual Translations list</span></div><div><span style="font-size:16px;">2) Machine translate the text to all the site's languages.&nbsp; In addition to machine translation it also looks up built-in translations and translations coming from the top level site's translations list.&nbsp; You can check the translations list before and after the machine translation.</span></div><div><span style="font-size:16px;">3) Apply those translations to the interface</span></div><div><br></div><p><span style="color:inherit;font-size:16px;"></span></p><div><p style="margin-bottom:15px;"><span style="font-weight:bold;font-size:16px;">UI translation covers the following elements</span></p><ul><li style="margin-bottom:10px;"><span style="font-size:16px;">Site names and descriptions</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">List/Library/Calendar names and descriptions</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">View names</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">Column names and descriptions</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">Content type names and descriptions</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">Most types of navigation</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">Custom Actions</span></li><li style="margin-bottom:10px;"><span style="font-size:16px;">Selected webpart names</span></li></ul><div><span style="font-size:16px;">All this in addition to the existing features, webpart visibility by language, filtering of lists, libraries, and calendars by language, language filtering of content search webparts, and machine translation for documents, list items, pages, and events, including translation of all text, richtext, and html metadata.</span></div><div><br></div><div><span style="font-size:16px;">Coming up in the next few weeks: PowerShell scriptable machine translation.&nbsp; This uses the new neural translation engine, which is much better than the previous machine translation engines, and in addition to text, html pages, and Word documents, it handles PDF, Excel, and PowerPoint.</span></div><div><br></div><div><span style="font-size:16px;">Also in the pipeline, version 2.1 is coming in a few weeks will have support for modern lists, libraries, and pages, including the new Communication sites.&nbsp; Stay tuned!</span></div></div></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 08 Nov 2017 11:11:00 -0500</pubDate></item></channel></rss>