# ILocaleDiscovery

> Optional interface an asset provider implements to discover and register additional locales at runtime.

## Definition

* **Type:** Interface
* **Namespace:** [Unity.Localization](/engine/6000.7/script-reference/unity/localization.md)
* **Assembly:** UnityEngine.LocalizationRuntimeModule

```csharp
public interface ILocaleDiscovery
```

## Remarks

Implement this alongside [IAssetProvider](/engine/6000.7/script-reference/unity/localization/providers/iassetprovider.md) when a provider can find locales that are not known at build time, for example from data files added to a built player. Each provider in the chain is called during [LocalizationSettings.InitializeAsync](/engine/6000.7/script-reference/unity/localization/localizationsettings/initializeasync.md), before the startup locale selectors run, so a discovered locale can be chosen as the startup locale. Register discovered locales through [LocalizationSettings.AddLocale](/engine/6000.7/script-reference/unity/localization/localizationsettings/addlocale.md); providers that only serve the locales shipped with the project do not need this interface.

Additional Resources: [LocalizationSettings](/engine/6000.7/script-reference/unity/localization/localizationsettings.md), [Locale](/engine/6000.7/script-reference/unity/localization/locale.md), [IAssetProvider](/engine/6000.7/script-reference/unity/localization/providers/iassetprovider.md)

Discover locales from installed data files and register each one at startup.

## Examples

```csharp
using System.Threading;
using Unity.Localization;
using Unity.Localization.Providers;
using UnityEngine;
using Object = UnityEngine.Object;

namespace Unity.Localization.Samples
{
    public class DiskLocaleProviderExample : IAsyncAssetProvider, ILocaleDiscovery
    {
        public async Awaitable DiscoverLocalesAsync(LocalizationSettings settings, CancellationToken cancellationToken = default)
        {
            foreach (var code in await ReadInstalledLocaleCodesAsync(cancellationToken))
                settings.AddLocale(new Locale(code));
        }

        async Awaitable<string[]> ReadInstalledLocaleCodesAsync(CancellationToken cancellationToken)
        {
            await Awaitable.NextFrameAsync(cancellationToken);
            return new[] { "en", "fr", "de" };
        }

        public async Awaitable<T> LoadAssetAsync<T>(AssetKey key, CancellationToken cancellationToken) where T : Object
        {
            await Awaitable.NextFrameAsync(cancellationToken);
            return null;
        }

        public void Release(Object asset) { }
    }
}
```

## Methods

| Method                                                                                                              | Description                                               |
| ------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| [DiscoverLocalesAsync](/engine/6000.7/script-reference/unity/localization/ilocalediscovery/discoverlocalesasync.md) | Registers any additional locales this provider can serve. |
