Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 189 additions & 0 deletions docs/faqs/app-translation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
## Overview

* If you want to view translated pages of `LoopDocs`, please click on [Translation](../translate.md).

* If you want to view your app on your phone in a different language, instructions are found at [Translated App on the Phone](#translated-app-on-the-phone).

* If you want to help provide translations for everyone to use on their phone with their app (*Loop*, *Trio*, or *iAPS*), please click on [Code Translation](#code-translation).

## Translated App on the Phone

You can select the language you want displayed for any given app in your phone settings.

If you have only one language on your phone, you will not see choices under the app settings. Click on the link below (for Apple instructions) to add language options to your phone.

* [Add more than one language to your phone](https://support.apple.com/en-us/109358)

Once your phone is configured to have more than one language, then the steps below should work.

* Tap on phone Settings
* Scroll down and tap on Apps
* Choose your app, e.g., `Loop`
* Scroll down to Preferred Language
* Choose the language you prefer

![choose a lanuage for Loop](img/choose-language-for-app.png){width="600"}
{align="center"}

If a given phrase in the app does not have a translation string in what is called the String Catalog, then the app displays English. If you see an English phrase and you want to help yourself, and others, you can become a translator.

For the *Loop* app and the submodules (Pumps, CGM and Services) associated with the *Loop* app, the [*lokalise*](https://app.lokalise.com/projects) website is used. You must be signed up with the *Loop* project to be able to see *Loop* translations at that site.

!!! note "Want to Sign Up to Translate?"
To volunteer to translate, join [Loop zulipchat](https://loop.zulipchat.com/) and send a direct message to Marion Barker with your email address and the language(s) you can translate.


## Code Translation

Localization (strings translated to the selected language in the app) makes use of volunteers who input translations in a special web app. Their work is then dowloaded and imported into the code used by the *Loop* app and its submodules (repositories on *GitHub*).

If you notice *Loop* app messages in English even though you selected a specific language, and you can help translate it, please volunteer.

Translations for Loop are performed by volunteers at [*lokalise*](https://app.lokalise.com/projects).

To volunteer, join [Loop zulipchat](https://loop.zulipchat.com/) and send a direct message to Marion Barker with your email address and the language(s) you can translate. You will get an invitation to join the project. You do not need to start a new project, start a free trial or sign up for anything special; just join the project you are invited to.

> If you are using the *Trio* or *iAPS* app instead of the *Loop* app, you can still assist with Pump, CGM and Tidepool module localization through *Loop* *lokalise*. Some repositories from *Loop* are used by [*Trio* and *iAPS*](#what-about-other-ios-apps).

### Initial Screen on *lokalise*

When you log in to *lokalise*, you will see a screen similar to the screenshot below. Tap on the *Loop* icon, highlighted in the graphic with a red rectangle, to start translating.

![initial screen on opening lokalise](img/lokalise-initial-screen.png){width="600"}
{align="center"}

After tapping on the *Loop* icon, you see the general translation tasks. (Your screen may look different.)

On the left are `keys` with the English language showing. On the right is the translation for that `key` in the language you selected. Each `key` has one or more words. The statistics list the total number of keys and the total number of words.

![initial translation screen on lokalise](img/lokalise-initial-edit-screen.png){width="600"}
{align="center"}

### How to Find Strings to Translate

You can search for:

* strings that are [not translated](#not-translated), which show up as Empty
* strings in a particular [submodule](#select-a-submodule) (for example - the Pump or CGM that you use)
* strings where the [English version was copied](#matches-source) to the translated field
* strings where you disagree with the translation
* some strings may have been automatically translated
* some translations may have a typographical error

### Not Translated

Strings that have not been translated can be selected by tapping on Filter and choosing Untranslated. An example graphic is shown before choosing untranslated keys. First tap on Filter than tap on Untranslated.

![initial translation screen on lokalise](img/lokalise-filter-untranslated.png){width="900"}
{align="center"}

### Enter a Translation

After tapping on an item that is empty or you want to modify, type your translation into the box on the right, where you see the words "enter translation here" in the graphic below.

![initial translation screen on lokalise](img/lokalise-selected-phrase.png){width="900"}
{align="center"}

Notice the filename where that key is stored is indicated when you examine the details of a key. In the graphic above, the file `Loop/Loop/Localizable.xcstrings` is indicated.

The area under the key has a comment. This is something added in the code to explain the use of the key.

If a `key` does not have a translation in a given language, then when running the app, the English version is automatically provided. Do **not** tap on `Insert source`.

> The only reason to use `Insert source` would be if that `key` should always be identical to the English version and you want to avoid having that `key` show up when looking for untranslated keys.

### Select a Submodule

Suppose you know that you want to modify translations for a particular submodule (CGM, Pump or Service module). You can choose context in *lokalise*.

* Tap on Filter
* Tap on Context
* Choose the submodule file
* some submodules have multiple string catalogs (*.xcstrings)
* some items are old enough to have a few of the older string format (*.strings)
* You can ignore any file that includes "Info.plist"
* those strings do not need to be translated and the keys should be configured to be hidden from translators

The screenshot below is configured for someone translating simplified Chinese for the DanaKit pump.

![choose a submodule for translation](img/lokalise-by-context-submodule-xcstrings.png){width="1024"}
{align="center"}

#### Submodule Table for Multiple Apps

These submodules are used by the *Loop*, *Trio* and *iAPS* apps.

| Type | <div style="width:145px"></div> Name | Files |
|:-:|:--|:--|
| CGM | `CGMBLEKit` | CGMBLEKit/CGMBLEKit/Localizable.xcstrings<br>CGMBLEKit/CGMBLEKitUI/Localizable.xcstrings |
| CGM | `G7SensorKit` | G7SensorKit/G7SensorKit/Localizable.xcstrings<br>G7SensorKit/G7SensorKitUI/Localizable.xcstrings |
| CGM | `LibreTransmitter` | LibreTransmitter/LibreTransmitter/Localizable.xcstrings<br>LibreTransmitter/LibreTransmitterUI/Localizable.xcstrings |
| CGM | `Dexcom Share` | dexcom-share-client-swift/ShareClient/Localizable.xcstrings<br>dexcom-share-client-swift/ShareClientUI/Localizable.xcstrings |
| CGM | `NightscoutRemoteCGM` | NightscoutRemoteCGM/NightscoutRemoteCGM/Localizable.xcstrings |
| Pump | `DanaKit` | DanaKit/Localization/Localizable.xcstrings |
| Pump | `MedtrumKit` | MedtrumKit/Localization/Localizable.xcstrings |
| Pump | `OmniBLE` | OmniBLE/Localizable.xcstrings<br>OmniBLE/OmniBLE/Localizable.xcstrings |
| Pump | `RileyLinkKit` | RileyLinkKit/RileyLink/Localizable.xcstrings<br>RileyLinkKit/RileyLink/LoopKit.xcstrings<br>RileyLinkKit/RileyLinkBLEKit/Localizable.xcstrings<br>RileyLinkKit/RileyLinkKitUI/Localizable.xcstrings |
| Pump | `MinimedKit` | MinimedKit/MinimedKit/Resources/Localizable.xcstrings<br>MinimedKit/MinimedKitUI/Resources/Localizable.xcstrings<br>MinimedKit/MinimedKitUI/Resources/mul.lproj/MinimedPumpManager.xcstrings|
| Pump | `OmniKit` | OmniKit/Localizable.xcstrings<br>OmniKit/OmniKit/Resources/Localizable.xcstrings<br>OmniKit/OmniKitUI/Resources/Localizable.xcstrings |
| Misc | `LoopKit` | LoopKit/LoopKit/Resources/Localizable.xcstrings<br>LoopKit/LoopKitUI/Resources/Localizable.xcstrings<br>LoopKit/LoopKitUI/Resources/mul.lproj/InsulinKit.xcstrings<br>LoopKit/LoopKitUI/Resources/mul.lproj/LegacyInsulinDeliveryTableViewController.xcstrings<br>LoopKit/MockKit/Resources/Localizable.xcstrings<br>LoopKit/MockKitUI/Resources/Localizable.xcstrings |
| Service | `TidepoolService` | TidepoolService/TidepoolServiceKit/Localizable.xcstrings<br>TidepoolService/TidepoolServiceKitUI/Localizable.xcstrings |

### Matches Source

Some of the String Catalogs have had the English version inserted in the translation field. This was done inadvertently. To find these instances in the language you are translating, set up a custom filter.

First click on Filter, then Customize (see red highlights in graphic below)

![select a custom filter on lokalise](img/lokalise-filter-custom.png){width="900"}
{align="center"}

The next screen allows you to choose `Translation` in one drop-down and then `matches source` in the adjacent drop-down.

![configure a custom filter for same as source on lokalise](img/lokalise-filter-for-matches-source.png){width="900"}
{align="center"}

You can hit Apply or Save and Apply and give it a name so you can select the Name next time.

The screenshot below is after creating and naming a custom filter called `Translation Matches Source`.

![example using custom filter matches source on lokalise](img/lokalise-matches-source.png){width="900"}
{align="center"}


### Find a String

If you observe a string you want to modify, you can type it in directly. The text you type in the search box can be all or part of a string, and in English or the language you are translating.

![example using custom filter matches source on lokalise](img/lokalise-key-search.png){width="900"}
{align="center"}

- - -

## What About Other iOS Apps

The *Trio* and the *iAPS* apps use submodules for CGM, Pump and Service features originally developed for the *Loop* app. New CGM and Pump modules are coming soon or already available. These are being configured for use with all these iOS apps.

* The shared code originally developed for the *Loop* app resides in the *GitHub* *LoopKit* organization and is under the control of the *LoopKit* owners
* The *Trio* app has always used forks for these repositories so get their localizations for the CGM, Pump and Service modules from *lokalise*
* The *iAPS* app initially used copies of the code - not connected to the *LoopKit* repositories - and configured their own crowdin site for *iAPS* localization
* However, as improvements to the submodules evolved at *LoopKit*, the updates needed to be hand-edited and added to the *iAPS* copies
* In late 2025, *iAPS* started the transition to using forks from *LoopKit* instead of copies
* Some of the *iAPS* translations for CGM, Pump and Service submodules were imported into *lokalise* at this time

The bottom line is

* Submodule translations are handled at [*lokalise*](https://app.lokalise.com/)
* *Trio* translations are handled at [crowdin for *Trio*](https://crowdin.com/project/trio/invite/public?h=48e1a77abd1611860f475c1ce17540112591650&show_welcome)
* *iAPS* translations are handled at [crowdin for *iAPS*](https://crowdin.com/project/iaps)

You can use the *Trio* or *iAPS* discord server to volunteer to translate using *lokalise* by sending a direct message to Marion Barker if you are not a member of zulipchat.

- - -

## Adding Languages

We can add languages if a translator commits to take on that task.

At lokalise, the language must be added first before translators have access to that language. Send a DM to Marion Barker with your request for a new language.

Binary file added docs/faqs/img/choose-language-for-app.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-filter-custom.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-filter-untranslated.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-initial-edit-screen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-initial-screen.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-key-search.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-matches-source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/faqs/img/lokalise-selected-phrase.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions docs/faqs/overview-faqs.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ Map to this section:
* [Omnipod FAQs](../faqs/omnipod-faqs.md)
* [CGM FAQs](../faqs/cgm-faqs.md)
* [Update/Rebuild Loop FAQs](../faqs/update-faqs.md)
* [What if I'm Changing Phones](../faqs/update-faqs.md#what-if-im-changing-phones)
* [New Phone Tips](../faqs/new-phone.md)
* [RileyLink FAQs](../faqs/rileylink-faqs.md)
* [Remote Control FAQs](../faqs/remote-control.md)
* [Translation FAQs](../faqs/app-translation.md)
* [Algorithm FAQs](../faqs/algorithm-faqs.md)
* [Apple Health FAQs](../faqs/apple-health-faqs.md)
* [RileyLink FAQs](../faqs/rileylink-faqs.md)
* [Glossary](../faqs/glossary.md)
40 changes: 40 additions & 0 deletions docs/faqs/remote-control.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## Remote Caregivers

If you are a caregiver and want to issue remote commands to the *Loop* app, you have 3 options. All of these require you to configure a [Nightscout site](../nightscout/overview.md){: target="_blank" } for that person.

Once the Nightscout site is configured, you can remotely monitor that person.

In the documentation below, the OTP is a one-time password that changes every 30 seconds.

You can add remote control to:

* modify the Override (Custom Preset)
* add Carbohydrates (requires OTP)
* issue a Bolus (requires OTP)

You have 3 ways in which to do this. The first two require additions to the config vars on your Nightscout site and then you send commands through the Nightscout site either directly (option 1) or using the *LoopCaregiver* app (option 2) to the Looper's phone. The third option (*LoopFollow*) uses direct Apple Push Notifications (APNS) from your phone to the Looper's phone. With that method, the Nightscout site is used for monitoring, not issuing commands.

All of these methods require APNS keys from someone with an Apple Developers License and that must be the same developer who built to *Loop* app.

1. Use the [Careportal at the Nightscout URL](../nightscout/remote-commands.md){: target="_blank" }
* If the Caregiver uses an Android phone, this is your only option
* The Nightscout config vars must include APNS keys and the developer ID for the developer who built the Loop app
2. Build the [*LoopCaregiver* app](../nightscout/loop-caregiver.md){: target="_blank" } on the caregiver's iPhone to issue command through the Nightscout site
* The Caregiver must have an iPhone with iOS 16 or newer
* The Nightscout config vars must include APNS keys and the developer ID for the developer who built the Loop app
3. Build the [*LoopFollow* app](https://loopfollowdocs.org/remote/remote-control-loop/) on the caregiver's phone to directly issue APNS to the Looper's phone, this can be faster and more reliable
* The Caregiver must have an iOS phone with iOS 16 or newer
* The Nightscout site monitors the Looper's phone
* No additions to the Nightscout config vars are required - this makes it easier when you use Nightscout as a Service

## Customization for Longer OTP Window

May people find the OTP expires too soon when their Looper is on a different network from the Caregiver.

Consider adding the option that allows Loop to accept a remote command that arrives within a 15 minute window.

Please review this carefully before deciding to use this.

* [Increase Remote Window to 15 minutes](https://www.loopandlearn.org/loop-features-in-development/#remote-window)

This customization is for the *Loop* app so works with all three remote methods mentioned in the previous section.
32 changes: 18 additions & 14 deletions docs/translate.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
The lanuage list below provides automatic translation for `LoopDocs`.

To assist with translation for the app on your phone, please see [App Translation](faqs/app-translation.md){: target="_blank" }.

## Language List

[عربي](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ar)

[Български](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=bg)

[Čeština](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=cs)
[Нохчийн](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=ce)

[Deutsch](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=de)
[Čeština](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=cs)

[Dansk](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=da)

[Deutsch](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=de)

[Ελληνικά](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=el)

[Español](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=es)
Expand Down Expand Up @@ -48,17 +54,23 @@

[Turkish](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=tr)

[українська](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=uk)

[Tiếng Việt](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=vi)

([中国人](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-HAN))

中文([简体](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-CN))

中文([繁體](https://loopkit-github-io.translate.goog/loopdocs/?_x_tr_sl=auto&_x_tr_tl=zh-TW))

## Google Translate Links

Click on a language on the list of links above to turn on Google's automatic translation.
Click on a language on the list of links above to turn on Google's automatic translation. This opens in a new browser tab. To return to English, switch back to the original tab.

## Change Language
### Change Language

To modify the language choice for the whole site, copy the line below, and paste it into the URL, and then choose the desired language from the list above.
To modify the language choice for the whole site you can return to the original tab (which is in English). If you closed that tab and are on a translated page, then you can copy the line below, and paste it into the URL, and then choose the desired language from the list.

``` { .bash .copy title="Copy and Paste in Browser URL to return to original version" }
https://loopkit.github.io/loopdocs/translate
Expand Down Expand Up @@ -99,12 +111,4 @@ The graphic below shows the Google Translate Tool when maximized (default) for a

## Code Translation

The localization (strings translated to the selected language in the *Loop* app) makes use of volunteers who input translations in a special web app. Their work is then dowloaded and imported into the code used by Loop and its submodules (repositories on GitHub).

If you notice *Loop* app messages in English even though you selected a specific language, and you can help translate it, please volunteer.

Translations for Loop are performed by volunteers at [lokalise](https://app.lokalise.com/projects).

To volunteer, join [Loop zulipchat](https://loop.zulipchat.com/) and send a direct message to Marion Barker with your email address and the language(s) you can translate.

If you are using the *Trio* app instead of the *Loop* app, you can still assist with pump, CGM and Tidepool module localization through Loop lokalise. Some repositories from *Loop* are used by *Trio*. You can use the *Trio* discord server to volunteer by sending a direct message to Marion if you are not a member of zulipchat.
The information about code translation has moved. Please see [App Translation](faqs/app-translation.md).
4 changes: 3 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,10 @@ nav:
- 'CGM FAQs': 'faqs/cgm-faqs.md'
- 'Update/Rebuild Loop FAQs': 'faqs/update-faqs.md'
- 'New Phone Tips': 'faqs/new-phone.md'
- 'RileyLink FAQs': 'faqs/rileylink-faqs.md'
- 'Remote Control FAQs': 'faqs/remote-control.md'
- 'Translation FAQS': 'faqs/app-translation'
- 'Algorithm FAQs': 'faqs/algorithm-faqs.md'
- 'Apple Health FAQs': 'faqs/apple-health-faqs.md'
- 'RileyLink FAQs': 'faqs/rileylink-faqs.md'
- 'Glossary': 'faqs/glossary.md'
- Translation: 'translate.md'