# IStartupLocalePrepare

> Optional hook a startup selector implements to load what it needs before the locale is chosen.

## Definition

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

```csharp
public interface IStartupLocalePrepare
```

## Remarks

Implement this interface alongside [IStartupLocaleSelector](/engine/6000.7/script-reference/unity/localization/istartuplocaleselector.md) when the locale comes from somewhere that has to be awaited, such as a cloud save or a platform API. [LocalizationSettings.InitializeAsync](/engine/6000.7/script-reference/unity/localization/localizationsettings/initializeasync.md) awaits [IStartupLocalePrepare.PrepareAsync](/engine/6000.7/script-reference/unity/localization/istartuplocaleprepare/prepareasync.md) on every selector that implements it, after the asset providers have discovered their locales and before any selector is asked to choose. Store the result and return it from [IStartupLocaleSelector.GetStartupLocale](/engine/6000.7/script-reference/unity/localization/istartuplocaleselector/getstartuplocale.md), which stays synchronous. The three hooks run in the order [IStartupLocalePrepare.PrepareAsync](/engine/6000.7/script-reference/unity/localization/istartuplocaleprepare/prepareasync.md), then [IStartupLocaleSelector.GetStartupLocale](/engine/6000.7/script-reference/unity/localization/istartuplocaleselector/getstartuplocale.md), then [IStartupLocaleInitialize.PostInitialize](/engine/6000.7/script-reference/unity/localization/istartuplocaleinitialize/postinitialize.md).

Additional Resources: [IStartupLocaleSelector](/engine/6000.7/script-reference/unity/localization/istartuplocaleselector.md), [IStartupLocaleInitialize](/engine/6000.7/script-reference/unity/localization/istartuplocaleinitialize.md), [LocalizationSettings.InitializeAsync](/engine/6000.7/script-reference/unity/localization/localizationsettings/initializeasync.md)

A selector that awaits a value before choosing a locale.

## Examples

```csharp
using System;
using System.Threading;
using Unity.Localization;
using UnityEngine;

namespace Unity.Localization.Samples
{
    [Serializable]
    public class AsyncLocaleSelectorExample : IStartupLocaleSelector, IStartupLocalePrepare
    {
        string m_Code;

        public async Awaitable PrepareAsync(LocalizationSettings settings, CancellationToken cancellationToken = default)
        {
            m_Code = await FetchPreferredLanguageAsync(cancellationToken);
        }

        public Locale GetStartupLocale(LocalizationSettings settings)
            => string.IsNullOrEmpty(m_Code) ? null : settings.GetLocale(m_Code);

        // Stands in for a platform API or a cloud save that has to be awaited.
        static async Awaitable<string> FetchPreferredLanguageAsync(CancellationToken cancellationToken)
        {
            await Awaitable.NextFrameAsync(cancellationToken);
            return "fr";
        }
    }
}
```

## Methods

| Method                                                                                                   | Description                                                        |
| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |
| [PrepareAsync](/engine/6000.7/script-reference/unity/localization/istartuplocaleprepare/prepareasync.md) | Loads whatever the selector needs before it is asked for a locale. |
