Skip to content
This repository has been archived by the owner on Jan 29, 2024. It is now read-only.

Commit

Permalink
feat(service): add translationId as param of custom interpolation ser…
Browse files Browse the repository at this point in the history
…vice interface
  • Loading branch information
joelongstreet authored and knalli committed Feb 11, 2017
1 parent a4d2795 commit 5de40de
Show file tree
Hide file tree
Showing 11 changed files with 115 additions and 39 deletions.
6 changes: 3 additions & 3 deletions docs/content/guide/de/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ die ein Objekt zurück gibt, die folgendes Interface implementiert:

- `setLocale(langKey)` - Setzt die Sprache mit Sprachschlüssel
- `getInterpolationIdentifier()` - Gibt einen Identifier für den Service zurück
- `interpolate(string, interpolateParams, sanitizeStrategy)` - Interpoliert Strings gegen Interpolationparamter
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - Interpoliert Strings gegen Interpolationparamter

So könnte ein custom Interpolation-Service aussehen:

Expand All @@ -37,7 +37,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -62,7 +62,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/en/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ have to be provided by a custom interpolation service:

- `setLocale(langKey)` - sets the currently used language
- `getInterpolationIdentifier()` - returns an identifier for interpolation
- `interpolate(string, interpolateParams, sanitizeStrategy)` - interpolates strings against interpolate params
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - interpolates strings against interpolate params

Let's see how it looks like when implementing a custom interpolation service. First,
we implement the interface:
Expand All @@ -38,7 +38,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -64,7 +64,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/es/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Cuando cree un serivcio de interpolación personalizado, hay muchas cosa que ya

- `setLocale(langKey)` - configura el lenguaje usado actualmente
- `getInterpolationIdentifier()` - devuelve una clave para identificar la interpolación
- `interpolate(string, interpolateParams, sanitizeStrategy)` - interpola cadenas contra parámetros de interpolación
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - interpola cadenas contra parámetros de interpolación

Veamos cómo se vería si implementáramos un servicio de interpolación personalizado. Primero, simplemente implementemos la interfaz:

Expand All @@ -31,7 +31,7 @@ app.factory('interpolacionPersonalizada', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -55,7 +55,7 @@ app.factory('interpolacionPersonalizada', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/fr/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ doivent être fournies par un service d'interpolation personnalisé :

- `setLocale(langKey)` - définit la langue utilisée
- `getInterpolationIdentifier()` - retourne un identifiant pour l'interpolation
- `interpolate(string, interpolateParams, sanitizeStrategy)` - interpole le string en interpolateParams
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - interpole le string en interpolateParams

Regardons à quoi ressemble l'implémentation d'un service d'interpolation personnalisé. Tout d'abord,
nous implémentons l'interface :
Expand All @@ -38,7 +38,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -64,7 +64,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/ru/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

- `setLocale(langKey)` - устанавливает текущий язык
- `getInterpolationIdentifier()` - возвращает идентификатор интерполяции
- `interpolate(string, interpolateParams, sanitizeStrategy)` - интерполирует строки с параметрами интерполяции
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - интерполирует строки с параметрами интерполяции

Давайте посмотрим как это выглядит при создании пользовательского сервиса интерполяции. Во-первых,
мы реализуем интерфейс:
Expand All @@ -37,7 +37,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -63,7 +63,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/uk/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

- `setLocale(langKey)` - встановлює поточну мову
- `getInterpolationIdentifier()` - повертає ідентифікатор інтерполяції
- `interpolate(string, interpolateParams, sanitizeStrategy)` - інтерполює рядки з параметрами інтерполяції
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - інтерполює рядки з параметрами інтерполяції

Давайте подивимося, як це виглядає при створенні користувацького сервісу інтерполяції. По-перше, ми
реалізуємо інтерфейс:
Expand All @@ -36,7 +36,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -62,7 +62,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/zh-cn/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

- `setLocale(langKey)` - 设置当前使用的语言
- `getInterpolationIdentifier()` - 返回一个标识符插值
- `interpolate(string, interpolateParams, sanitizeStrategy)` - 对字符串的params参数进行插值处理
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - 对字符串的params参数进行插值处理

让我们来看看怎么实现自定义的插值服务。首先,我们实现的接口:

Expand All @@ -32,7 +32,7 @@ app.factory('customInterpolation', function () {

},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

}
};
Expand All @@ -56,7 +56,7 @@ app.factory('customInterpolation', function ($interpolate) {
return 'custom';
},

interpolate: function (string, interpolateParams, sanitizeStrategy) {
interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
}
};
Expand Down
6 changes: 3 additions & 3 deletions docs/content/guide/zh-tw/15_custom-interpolators.ngdoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

- `setLocale(langKey)` - 設置當前使用的語言
- `getInterpolationIdentifier()` - 返回一個標識符插值
- `interpolate(string, interpolateParams, sanitizeStrategy)` - 對字符串的params參數進行插值處理
- `interpolate(string, interpolateParams, context, sanitizeStrategy, translationId)` - 對字符串的params參數進行插值處理

讓我們來看看怎麼實現自定義的插值服務。首先,我們實現的接口:

Expand All @@ -32,7 +32,7 @@ app.factory('customInterpolation', function () {

    },

    interpolate: function (string, interpolateParams, sanitizeStrategy) {
    interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {

    }
  };
Expand All @@ -56,7 +56,7 @@ app.factory('customInterpolation', function ($interpolate) {
      return 'custom';
    },

    interpolate: function (string, interpolateParams, sanitizeStrategy) {
    interpolate: function (string, interpolateParams, context, sanitizeStrategy, translationId) {
      return $locale + '_' + $interpolate(string)(interpolateParams, sanitizeStrategy) + '_' + $locale;
    }
  };
Expand Down
10 changes: 8 additions & 2 deletions src/service/default-interpolation.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,15 @@ function $translateDefaultInterpolation ($interpolate, $translateSanitization) {
*
* Since AngularJS 1.5, `value` must not be a string but can be anything input.
*
* @returns {string} interpolated string.
* @param value translation
* @param interpolationParams interpolation params
* @param context current context (filter, directive, service)
* @param sanitizeStrategy sanitize strategy
* @param translationId current translationId
*
* @returns {string} interpolated string
*/
$translateInterpolator.interpolate = function (value, interpolationParams, context, sanitizeStrategy) {
$translateInterpolator.interpolate = function (value, interpolationParams, context, sanitizeStrategy, translationId) {
interpolationParams = interpolationParams || {};
interpolationParams = $translateSanitization.sanitize(interpolationParams, 'params', sanitizeStrategy, context);

Expand Down
32 changes: 19 additions & 13 deletions src/service/translate.js
Original file line number Diff line number Diff line change
Expand Up @@ -1348,20 +1348,21 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
* @param translationId
* @param interpolateParams
* @param Interpolator
* @param sanitizeStrategy
* @returns {Q.promise}
*/
var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) {
var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy) {
var deferred = $q.defer();

var onResolve = function (translationTable) {
if (Object.prototype.hasOwnProperty.call(translationTable, translationId) && translationTable[translationId] !== null) {
Interpolator.setLocale(langKey);
var translation = translationTable[translationId];
if (translation.substr(0, 2) === '@:') {
getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator)
getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator, sanitizeStrategy)
.then(deferred.resolve, deferred.reject);
} else {
var interpolatedValue = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'service');
var interpolatedValue = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'service', sanitizeStrategy, translationId);
interpolatedValue = applyPostProcessing(translationId, translationTable[translationId], interpolatedValue, interpolateParams, langKey);

deferred.resolve(interpolatedValue);
Expand Down Expand Up @@ -1400,7 +1401,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide

if (translationTable && Object.prototype.hasOwnProperty.call(translationTable, translationId) && translationTable[translationId] !== null) {
Interpolator.setLocale(langKey);
result = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'filter', sanitizeStrategy);
result = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'filter', sanitizeStrategy, translationId);
result = applyPostProcessing(translationId, translationTable[translationId], result, interpolateParams, langKey, sanitizeStrategy);
// workaround for TrustedValueHolderType
if (!angular.isString(result) && angular.isFunction(result.$$unwrapTrustedValue)) {
Expand Down Expand Up @@ -1453,21 +1454,23 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
* @param translationId
* @param interpolateParams
* @param Interpolator
* @param defaultTranslationText
* @param sanitizeStrategy
* @returns {Q.promise} Promise that will resolve to the translation.
*/
var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText) {
var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy) {
var deferred = $q.defer();

if (fallbackLanguageIndex < $fallbackLanguage.length) {
var langKey = $fallbackLanguage[fallbackLanguageIndex];
getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(
getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy).then(
function (data) {
deferred.resolve(data);
},
function () {
// Look in the next fallback language for a translation.
// It delays the resolving by passing another promise to resolve.
return resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText).then(deferred.resolve, deferred.reject);
return resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy).then(deferred.resolve, deferred.reject);
}
);
} else {
Expand Down Expand Up @@ -1523,11 +1526,13 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
* @param translationId
* @param interpolateParams
* @param Interpolator
* @param defaultTranslationText
* @param sanitizeStrategy
* @returns {Q.promise} Promise, that resolves to the translation.
*/
var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText) {
var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy) {
// Start with the fallbackLanguage with index 0
return resolveForFallbackLanguage((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText);
return resolveForFallbackLanguage((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy);
};

/**
Expand All @@ -1536,14 +1541,15 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
* @param translationId
* @param interpolateParams
* @param Interpolator
* @param sanitizeStrategy
* @returns {String} translation
*/
var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator, sanitizeStrategy) {
// Start with the fallbackLanguage with index 0
return resolveForFallbackLanguageInstant((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, sanitizeStrategy);
};

var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText, uses) {
var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText, uses, sanitizeStrategy) {

var deferred = $q.defer();

Expand All @@ -1561,7 +1567,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
.then(deferred.resolve, deferred.reject);
} else {
//
var resolvedTranslation = Interpolator.interpolate(translation, interpolateParams, 'service');
var resolvedTranslation = Interpolator.interpolate(translation, interpolateParams, 'service', sanitizeStrategy, translationId);
resolvedTranslation = applyPostProcessing(translationId, translation, resolvedTranslation, interpolateParams, uses);
deferred.resolve(resolvedTranslation);
}
Expand All @@ -1576,7 +1582,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
// we try it now with one or more fallback languages, if fallback language(s) is
// configured.
if (uses && $fallbackLanguage && $fallbackLanguage.length) {
fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText)
fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy)
.then(function (translation) {
deferred.resolve(translation);
}, function (_translationId) {
Expand Down Expand Up @@ -1620,7 +1626,7 @@ function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvide
if (translation.substr(0, 2) === '@:') {
result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId, uses, sanitizeStrategy);
} else {
result = Interpolator.interpolate(translation, interpolateParams, 'filter', sanitizeStrategy);
result = Interpolator.interpolate(translation, interpolateParams, 'filter', sanitizeStrategy, translationId);
result = applyPostProcessing(translationId, translation, result, interpolateParams, uses, sanitizeStrategy);
}
} else {
Expand Down

0 comments on commit 5de40de

Please sign in to comment.