Screen Reader and UI Language

We are currently testing Collabora Online as a replacement for OOS in SharePoint. So far, everything works except for two things. We use a nginx as a reverse proxy. For the test, we are using the CODE image.

#nginx.conf

    location ^~ /hosting/discovery {
        proxy_pass http://collabora:9980;
        proxy_set_header Host $http_host;
    }

    location ^~ /browser {
        proxy_pass http://collabora:9980;
        proxy_set_header Host $http_host;
    }

    location ^~ /hosting/capabilities {
        proxy_pass http://collabora:9980;
        proxy_set_header Host $http_host;
    }

    location ~ ^/cool/ {
        proxy_pass http://collabora:9980;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;
        proxy_read_timeout 36000s;
    }

    location / {
        proxy_pass http://collabora:9980;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;
        proxy_read_timeout 36000s;
    }
#compose.yaml

  collabora:
    image: collabora/code:25.04.9.4.1
    container_name: collabora
    user: "1001:1001"
    cap_drop:
      - ALL
    cap_add:
      - SYS_CHROOT
      - SYS_ADMIN
      - FOWNER
      - CHOWN    
    volumes:
      - ./collabora/proof_key:/etc/coolwsd/proof_key
      - ./collabora/proof_key.pub:/etc/coolwsd/proof_key.pub
    environment:
      - aliasgroup1=https://XXX.XXX.XX
      - username=admin
      - password=${COL_ADMIN_PW}
      - server_name=XXX.XXX.XX
      - extra_params= >
        --o:ssl.enable=false 
        --o:ssl.termination=true 
        --o:ssl.verification=true 
        --o:logging.level=information
        --o:security.enable_macros_execution=true 
        --o:security.macro_security_level=1
        --o:watermark.opacity=0.1
        --o:watermark.text=EXAMPLE-WATERMARK
        --o:accessibility.enable=true
  1. Screen Reader - No audio output
    Using extra_params, we activate the screen reader. As expected, the necessary language packages are already installed in the image. The button appears (under help menu) and can also be pressed. Unfortunately, we do not get any audio output. Unfortunately, the container log does not contain any indications of whether there are server-side problems either.

  2. UI Language - Configuration how?
    I am not entirely clear on how to permanently change the UI language. Currently in the browser, collabora online is in english. Language settings in the browser are primarily german. Is there an explicit section about it in the documentation?

Making sure you're not a bot! → &lang=de? → No change if applied

coolwsd.xml → allowed_languages?

Thank you very much for your cool software. Maybe you can help me.

Hi @Alfred

Welcome to the Collabora Online Forum!

It’s wonderful to hear you’re testing Collabora Online in SharePoint — and great to know things are working well for you so far with the CODE image and nginx reverse proxy setup. Quite a good job getting that all running!

Let me address your two questions:

1. Screen Reader – No Audio Output

This is worth noting: the screen reader functionality in Collabora Online is designed to work with a client-side screen reader (such as NVDA, JAWS, or Orca) already running on the user’s machine. The accessibility.enable=true parameter you’ve set correctly enables the accessibility support within Collabora Online, but Collabora itself doesn’t generate audio output server-side. It exposes an accessible DOM / ARIA-annotated interface that a screen reader on the user’s system can then pick up and read aloud.

So the expected workflow is: enable accessibility in Collabora (which you’ve done), then ensure the end user has a screen reader active on their desktop. The “screen reader” toggle under the Help menu essentially switches Collabora into an accessibility-friendly rendering mode so that external screen readers can interact with the document content properly.

If you already have a client-side screen reader running and still get no output, it may be worth checking that the browser being used is well-supported (Firefox and Chrome tend to work best with screen readers) and that the screen reader is set to interact with web content.

For example see the latest : Screen Reader Support in Collabora Online #FeatureFriday

2. UI Language – How to Configure

This one has actually been solved by another community member in a related thread! SharePoint SE in with Collabora Online – GUI in German [fixed]

The key is how the lang parameter is passed in the call to cool.html.

You’re on the right track with &lang=de, but the critical detail — especially behind a reverse proxy — is that the & character must be properly escaped in the URL. So the call needs to look like:

cool.html?lang=de&

With nginx as your reverse proxy, make sure that the & isn’t being swallowed or misinterpreted in the rewrite/proxy pass. The language parameter needs to survive the proxy chain intact and reach cool.html correctly.

A few things to check:

  • The lang=de parameter must be part of the actual call to cool.html — setting HTTP_ACCEPT_LANGUAGE headers or browser language alone isn’t sufficient, as the localization JSON may load based on browser language but not actually get applied without the explicit URL parameter.
  • After making the change, you may need to reset the WOPI binding in SharePoint for it to take effect.
  • Make sure the & escaping is correct for your specific reverse proxy configuration (nginx in your case).

Hope this helps you get both issues sorted!

Thanks
Darshan

Screen Reader → I got it. Thanks!

UI Languge - problem still exists

For testing reasons:

    location ^~ /browser {
        set $add_lang "";
        if ($uri ~ /cool\.html$) {
            set $add_lang "yes";
        }
        if ($args ~* "(^|&)lang=") {
            set $add_lang "";
        }
        set $extra_args $args;
        if ($add_lang = "yes") {
            set $extra_args "${args}&lang=de";
        }

        proxy_pass http://collabora:9980$uri?$extra_args;
        proxy_set_header Host $http_host;
    }

Nginx logs (lang=de param exists in upstream)

<X.X.X.X> - - [28/May/2026:09:41:01 +0000] "POST /browser/4610258811/cool.html?WOPISrc=https%3A%2F%2F<X>%2E<X>%2E<X>%2F%5Fvti%5Fbin%2Fwopi%2Eashx%2Ffiles%2F4f7c5225429546c49f973deca6a43837&sc=https%3A%2F%2F<X>%2E<X>%2E<X>%2FCollaboraTest%2FForms%2FAllItems%2Easpx&wdEnableRoaming=1&mscc=1&hid=240218a2-806b-4064-2196-155c92a4ff70 HTTP/2.0" 200 4638 "https://<X>.<X>.<X>/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0" 

-> upstream: "172.18.0.2:9980/browser/4610258811/cool.html?WOPISrc=https%3A%2F%2F<X>%2E<X>%2E<X>%2F%5Fvti%5Fbin%2Fwopi%2Eashx%2Ffiles%2F4f7c5225429546c49f973deca6a43837&sc=https%3A%2F%2F<X>%2E<X>%2E<X>%2FCollaboraTest%2FForms%2FAllItems%2Easpx&wdEnableRoaming=1&mscc=1&hid=240218a2-806b-4064-2196-155c92a4ff70&lang=de"

Collabora Online logs (lang=de param exists)

wsd-00001-00037 2026-05-28 11:09:32.363972 +0000 [ websrv_poll ] DBG  #24: Handling request: POSTHTTP/1.1 /browser/4610258811/cool.html?WOPISrc=https%3A%2F%2F<X>%2E<X>%2E<X>%2F%5Fvti%5Fbin%2Fwopi%2Eashx%2Ffiles%2F4f7c5225429546c49f973deca6a43837&sc=https%3A%2F%2F<X>%2E<X>%2E<X>%2FCollaboraTest%2FForms%2FAllItems%2Easpx&wdEnableRoaming=1&mscc=1&hid=340718a2-8073-4064-2196-15d5e0cdfbf6&lang=de, content 1197, chunked false, closeConnection false, Host: <X>.<X>.<X> / Content-Length: 1197 / user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0 / accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 / accept-language: de / accept-encoding: gzip, deflate, br, zstd / content-type: application/x-www-form-urlencoded / origin: https://<X>.<X>.<X>/ / referer: https://<X>.<X>.<X>/ / upgrade-insecure-requests: 1 / sec-fetch-dest: iframe / sec-fetch-mode: navigate / sec-fetch-site: same-site / priority: u=4 / pragma: no-cache / cache-control: no-cache| wsd/ClientRequestDispatcher.cpp:1004

Clientbrowser (de language based files downloaded)

But UI is still in English.
However, the de localization files are downloaded even without the lang parameter.

At the moment, I am somewhat at a loss as to where the problem actually lies.

Thanks

The only clue I currently have comes from the Collabora log. The following request likely originates from the SharePoint server:

kit-00032-00032 2026-05-28 13:09:18.088063 +0000 [ kitbroker_001 ] DBG #25: child_ws: recv [child-002 load xjail=file:///tmp/user/docs/eYbo3W52TozAwQhe/MS-Document.docx verifyHost=false xauthorid=i:0#.w%7C%5C xauthor= readonly=0 isAllowChangeComments=true lang=en-US deviceFormFactor=desktop timezone=Europe/Berlin darkTheme=false darkBackground=false enableMacrosExecution=true macroSecurityLevel=1 clientvisiblearea=0;0;24825;18240 accessibilityState=false | kit/KitWebSocket.cpp:51

→ lang=en-US

hi @Alfred

Great detective work — you’ve actually found the smoking gun :slight_smile:

This is the internal load command sent from the SharePoint WOPI host to the Collabora kit process, and it’s sending lang=en-US. This overrides everything you’ve done at the nginx/cool.html level.

Here’s what’s happening in the chain:

  1. Your nginx rewrite → correctly appends lang=de to the cool.html URL
  2. Collabora receives it → sees lang=de in the request
  3. Browser downloads German locale files → de JSON loaded
  4. But then SharePoint POSTs the WOPI frame with its own language setting → lang=en-US

The POST body from SharePoint (the content 1197 bytes you see in the Collabora log) carries WOPI parameters including the language, and this takes precedence over the URL query parameter. SharePoint is deciding the session language, not your reverse proxy.

After doing some research, it turns out you can configure this directly in SharePoint under Site Settings → Regional Settings by setting the locale to German (1031). That way SharePoint sends the correct lang=de to Collabora in the WOPI load command, and the nginx rewrite isn’t needed at all.

Let me know if this helps

Thanks
Darshan

Hi Darshan,

we have set the language and locale to German both in the site configuration and in the user settings. Unfortunately, everything still appears in English. We will continue working on it next week and try to identify the ‘most likely’ SharePoint-side cause.
Thanks for now. I will get back to you with a final description once we are ready.