Topolo Docs Topolo Platform
Open workspace

Get my language preferences

Resolve the caller's language and stored timezone preferences.

Outcome

Resolve the caller's language and stored timezone preferences.

Before you start

  • Verify the same intended caller and credential context before reading or updating preferences. No fixture credential or identity is usable live.

Discover the action

topolo whoami --json
topolo actions get app_topolo_auth.my_i18n_preferences.get --detail --json

Input fields

FieldRequiredMeaning
org_idOptionalOptional organization default for locale resolution; does not change credential context or grant access.
localeOptionalLocale query override on read; preferred persisted locale field on update. Region and language case are normalized.
langOptionalRead-only alias for the locale override; changes no stored preference.

Interpret the response

Read the authenticated caller’s preferences. org_id chooses an organization default for locale resolution; it does not change the credential context or grant organization access.

Locale precedence is locale/lang query, stored user locale, organization default, the first Accept-Language value, then en. source identifies the winning level; locale and effectiveLocale are the same normalized value. A query override affects this read only.

timezone comes only from the user’s stored current or legacy preference. null means none is stored; do not infer UTC. userLocale, orgDefaultLocale and browserLocale expose the normalized candidates. direction is rtl for the supported RTL language families and ltr otherwise.

The result is a value projection, not a reusable resource identifier or authorization decision. Preference-store read failures return SERVER_ERROR rather than an invented default response. Credential-verification failures, including a verification dependency outage, return AUTH_ERROR; that code alone does not prove expiry.

Worked requests and responses

Examples describe synthetic stored state. Headers shown for browser reads are part of that fixture; they are not action input fields. Resolve and use the current credential-scoped contract.

Stored user locale and timezone take precedence over organization and browser

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Fixture request headers

{
  "Accept-Language": "es-MX, en;q=0.8"
}

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "fr",
    "effectiveLocale": "fr",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": "de",
    "browserLocale": "es-MX",
    "source": "user",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

Stored user locale and timezone take precedence over organization and browser. This is the disclosed synthetic fixture state, not a live user preference.

URL locale is normalized and determines RTL while stored timezone is retained

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Input

{
  "locale": "ar-ae"
}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {
      "locale": "ar-ae"
    }
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "ar-AE",
    "effectiveLocale": "ar-AE",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": "de",
    "browserLocale": null,
    "source": "url",
    "defaultLocale": "en",
    "direction": "rtl"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

URL locale is normalized and determines RTL while stored timezone is retained. This is the disclosed synthetic fixture state, not a live user preference.

The lang alias affects this read only

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Input

{
  "lang": "en_US"
}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {
      "lang": "en_US"
    }
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "en-US",
    "effectiveLocale": "en-US",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": "de",
    "browserLocale": null,
    "source": "url",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

The lang alias affects this read only. This is the disclosed synthetic fixture state, not a live user preference.

Organization default applies when the user has no locale

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Fixture request headers

{
  "Accept-Language": "es-MX"
}

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "de",
    "effectiveLocale": "de",
    "timezone": null,
    "userLocale": null,
    "orgDefaultLocale": "de",
    "browserLocale": "es-MX",
    "source": "organization",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

Organization default applies when the user has no locale. This is the disclosed synthetic fixture state, not a live user preference.

Browser first language applies when both stored defaults are absent

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Fixture request headers

{
  "Accept-Language": "es-MX, fr;q=0.5"
}

Input

{
  "org_id": "org_missing_fixture"
}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {
      "org_id": "org_missing_fixture"
    }
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "es-MX",
    "effectiveLocale": "es-MX",
    "timezone": null,
    "userLocale": null,
    "orgDefaultLocale": null,
    "browserLocale": "es-MX",
    "source": "browser",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

Browser first language applies when both stored defaults are absent. This is the disclosed synthetic fixture state, not a live user preference.

English and null timezone are explicit defaults, not inferred UTC

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "en",
    "effectiveLocale": "en",
    "timezone": null,
    "userLocale": null,
    "orgDefaultLocale": null,
    "browserLocale": null,
    "source": "default",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

English and null timezone are explicit defaults, not inferred UTC. This is the disclosed synthetic fixture state, not a live user preference.

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Fixture request headers

{
  "Cookie": "topolo_access_token_js=synthetic-cookie"
}

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "fr",
    "effectiveLocale": "fr",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": "de",
    "browserLocale": null,
    "source": "user",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

Existing JavaScript access cookie uses the same self-only preference read. This is the disclosed synthetic fixture state, not a live user preference.

Legacy org_id claim selects the same organization language default

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "fr",
    "effectiveLocale": "fr",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": "de",
    "browserLocale": null,
    "source": "user",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

Legacy org_id claim selects the same organization language default. This is the disclosed synthetic fixture state, not a live user preference.

A credential without organization claims resolves only the available user and browser preferences

Actual controller, normalization and repository SQL on minimal isolated SQLite; access-token verification and clock simulated.

Input

{}

CLI: save the input as payload.json, then validate and plan the unchanged request. Confirm only an authorized mutation.

topolo actions validate app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions plan app_topolo_auth.my_i18n_preferences.get --data @payload.json --json
topolo actions call app_topolo_auth.my_i18n_preferences.get --data @payload.json --detail --json

MCP

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_auth.my_i18n_preferences.get",
    "input": {}
  }
}

HTTP 200 response

{
  "success": true,
  "message": "I18n preferences resolved",
  "data": {
    "locale": "fr",
    "effectiveLocale": "fr",
    "timezone": "Europe/Paris",
    "userLocale": "fr",
    "orgDefaultLocale": null,
    "browserLocale": null,
    "source": "user",
    "defaultLocale": "en",
    "direction": "ltr"
  },
  "timestamp": "2026-10-05T00:00:00.000Z"
}

A credential without organization claims resolves only the available user and browser preferences. This is the disclosed synthetic fixture state, not a live user preference.

Verification

  • Use data.source to explain the selected locale. Query overrides are ephemeral; data.userLocale is the persisted user locale and data.timezone may be null.

Recovery

This read changes no preference and requires no rollback.

Refusal and failure responses

Missing access credential is refused

HTTP 401

{}
{
  "success": false,
  "error": {
    "message": "Access token required",
    "code": "AUTH_ERROR",
    "details": null,
    "timestamp": "2026-10-05T00:00:00.000Z"
  }
}

Verify the same intended identity/context and preserve the structured failure details. AUTH_ERROR alone does not prove expiry: this handler also maps credential-verification dependency failures to 401. If verification storage is unavailable, wait for recovery and repeat the unchanged read; use normal sign-in or credential refresh when credential expiry/refusal is established. Do not substitute another user’s credential.

Credential verification refusal is authoritative

HTTP 401

{}
{
  "success": false,
  "error": {
    "message": "Synthetic expired credential",
    "code": "AUTH_ERROR",
    "details": null,
    "timestamp": "2026-10-05T00:00:00.000Z"
  }
}

Verify the same intended identity/context and preserve the structured failure details. AUTH_ERROR alone does not prove expiry: this handler also maps credential-verification dependency failures to 401. If verification storage is unavailable, wait for recovery and repeat the unchanged read; use normal sign-in or credential refresh when credential expiry/refusal is established. Do not substitute another user’s credential.

Credential-verification dependency failure also returns AUTH_ERROR before preference writes

HTTP 401

{}
{
  "success": false,
  "error": {
    "message": "Synthetic credential-verification storage unavailable",
    "code": "AUTH_ERROR",
    "details": null,
    "timestamp": "2026-10-05T00:00:00.000Z"
  }
}

Verify the same intended identity/context and preserve the structured failure details. AUTH_ERROR alone does not prove expiry: this handler also maps credential-verification dependency failures to 401. If verification storage is unavailable, wait for recovery and repeat the unchanged read; use normal sign-in or credential refresh when credential expiry/refusal is established. Do not substitute another user’s credential.

Unavailable preference storage returns an error

HTTP 500

{}
{
  "success": false,
  "error": {
    "message": "Synthetic preference read outage",
    "code": "SERVER_ERROR",
    "details": null,
    "timestamp": "2026-10-05T00:00:00.000Z"
  }
}

Retry the same read after storage recovers. Do not interpret failure as English, UTC or an access grant.

Evidence and limits

Actual isolated preference handlers; no live user preference or credential was changed.

Actual dependencies:

  • HTTP response serialization
  • Locale precedence and normalization
  • Timezone normalization through Intl
  • Existing preference repository SQL evaluated by SQLite

Simulated dependencies:

  • Access credential verification
  • Fixed clock and synthetic fixture records
  • Minimal users/organizations schema is not the complete migration database
  • Deliberate storage failures