@intlayer/core
Version:
Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.
74 lines (72 loc) • 4.17 kB
JavaScript
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
const require_utils_checkIsURLAbsolute = require('../utils/checkIsURLAbsolute.cjs');
const require_localization_getPathWithoutLocale = require('./getPathWithoutLocale.cjs');
const require_localization_getPrefix = require('./getPrefix.cjs');
let __intlayer_config_client = require("@intlayer/config/client");
let __intlayer_config_built = require("@intlayer/config/built");
__intlayer_config_built = require_rolldown_runtime.__toESM(__intlayer_config_built);
//#region src/localization/getLocalizedUrl.ts
/**
* Generate URL by prefixing the given URL with the referenced locale or adding search parameters
* based on the routing mode. Handles both absolute and relative URLs appropriately.
*
* This function gets the locales, default locale, and routing mode from the configuration if not provided.
*
* Example:
*
* ```ts
* // prefix-no-default mode
* getLocalizedUrl('/about', 'fr', { locales: ['en', 'fr'], defaultLocale: 'en', mode: 'prefix-no-default' });
* // Returns '/fr/about' for the French locale
* // Returns '/about' for the English locale (default)
*
* // prefix-all mode
* getLocalizedUrl('/about', 'en', { locales: ['en', 'fr'], defaultLocale: 'en', mode: 'prefix-all' });
* // Returns '/en/about' for the English locale
* // Returns '/fr/about' for the French locale
*
* // search-params mode
* getLocalizedUrl('/about', 'fr', { locales: ['en', 'fr'], defaultLocale: 'en', mode: 'search-params' });
* // Returns '/about?locale=fr' for the French locale
*
* // no-prefix mode
* getLocalizedUrl('/about', 'fr', { locales: ['en', 'fr'], defaultLocale: 'en', mode: 'no-prefix' });
* // Returns '/about' for any locale
* ```
*
* @param url - The original URL string to be processed.
* @param currentLocale - The current locale.
* @param options - Configuration options
* @param options.locales - Optional array of supported locales. Defaults to configured locales.
* @param options.defaultLocale - The default locale. Defaults to configured default locale.
* @param options.mode - URL routing mode for locale handling. Defaults to configured mode.
* @returns The localized URL for the current locale.
*/
const getLocalizedUrl = (url, currentLocale, options = {}) => {
const { locales = __intlayer_config_built.default?.internationalization?.locales ?? __intlayer_config_client.DefaultValues.Internationalization.LOCALES, defaultLocale = __intlayer_config_built.default?.internationalization?.defaultLocale ?? __intlayer_config_client.DefaultValues.Internationalization.DEFAULT_LOCALE, mode = __intlayer_config_built.default?.routing?.mode ?? __intlayer_config_client.DefaultValues.Routing.ROUTING_MODE } = options;
const urlWithoutLocale = require_localization_getPathWithoutLocale.getPathWithoutLocale(url, locales);
if (mode === "no-prefix") return urlWithoutLocale;
const isAbsoluteUrl = require_utils_checkIsURLAbsolute.checkIsURLAbsolute(urlWithoutLocale);
const parsedUrl = isAbsoluteUrl ? new URL(urlWithoutLocale) : new URL(urlWithoutLocale, "http://example.com");
const baseUrl = isAbsoluteUrl ? `${parsedUrl.protocol}//${parsedUrl.host}` : "";
if (mode === "search-params") {
const searchParams = new URLSearchParams(parsedUrl.search);
searchParams.set("locale", currentLocale.toString());
const queryString = searchParams.toString();
const pathWithQuery = queryString ? `${parsedUrl.pathname}?${queryString}` : parsedUrl.pathname;
if (isAbsoluteUrl) return `${baseUrl}${pathWithQuery}${parsedUrl.hash}`;
return `${pathWithQuery}${parsedUrl.hash}`;
}
const { prefix } = require_localization_getPrefix.getPrefix(currentLocale, {
defaultLocale,
mode
});
let localizedPath = `/${prefix}${parsedUrl.pathname}`;
localizedPath = localizedPath.replaceAll(/\/+/g, "/");
if (localizedPath.length > 1 && localizedPath.endsWith("/")) localizedPath = localizedPath.slice(0, -1);
if (isAbsoluteUrl) return `${baseUrl}${localizedPath}${parsedUrl.search}${parsedUrl.hash}`;
return `${localizedPath}${parsedUrl.search}${parsedUrl.hash}`;
};
//#endregion
exports.getLocalizedUrl = getLocalizedUrl;
//# sourceMappingURL=getLocalizedUrl.cjs.map