diff --git a/packages/translate/src/index.js b/packages/translate/src/index.js
index 6c58cb730ff..03259af202b 100644
--- a/packages/translate/src/index.js
+++ b/packages/translate/src/index.js
@@ -53,6 +53,14 @@ var PKG = require('../package.json');
*
* @param {object} options - [Configuration object](#/docs).
* @param {string} options.key - An API key.
+ *
+ * @example
+ * //-
+ * //
Custom Translate API
+ * //
+ * // The environment variable, `GOOGLE_CLOUD_TRANSLATE_ENDPOINT`, is honored as
+ * // a custom backend which our library will send requests to.
+ * //-
*/
function Translate(options) {
if (!(this instanceof Translate)) {
@@ -66,6 +74,13 @@ function Translate(options) {
throw new Error('An API key is required to use the Translate API.');
}
+ this.baseUrl = 'https://www.googleapis.com/language/translate/v2';
+
+ if (process.env.GOOGLE_CLOUD_TRANSLATE_ENDPOINT) {
+ this.baseUrl = process.env.GOOGLE_CLOUD_TRANSLATE_ENDPOINT
+ .replace(/\/+$/, '');
+ }
+
this.options = options;
this.key = options.key;
}
@@ -382,9 +397,7 @@ Translate.prototype.translate = function(input, options, callback) {
* @param {function} callback - The callback function passed to `request`.
*/
Translate.prototype.request = function(reqOpts, callback) {
- var BASE_URL = 'https://www.googleapis.com/language/translate/v2';
-
- reqOpts.uri = BASE_URL + reqOpts.uri;
+ reqOpts.uri = this.baseUrl + reqOpts.uri;
reqOpts = extend(true, {}, reqOpts, {
qs: {
diff --git a/packages/translate/test/index.js b/packages/translate/test/index.js
index c4f0d814bf9..b0a3470211e 100644
--- a/packages/translate/test/index.js
+++ b/packages/translate/test/index.js
@@ -33,7 +33,9 @@ var fakeUtil = extend({}, util, {
});
describe('Translate', function() {
- var API_KEY = 'api-key';
+ var OPTIONS = {
+ key: 'api-key'
+ };
var Translate;
var translate;
@@ -49,16 +51,14 @@ describe('Translate', function() {
beforeEach(function() {
makeRequestOverride = null;
- translate = new Translate({
- key: API_KEY
- });
+ translate = new Translate(OPTIONS);
});
describe('instantiation', function() {
it('should normalize the arguments', function() {
var normalizeArguments = fakeUtil.normalizeArguments;
var normalizeArgumentsCalled = false;
- var fakeOptions = { key: API_KEY };
+ var fakeOptions = extend({}, OPTIONS);
var fakeContext = {};
fakeUtil.normalizeArguments = function(context, options, cfg) {
@@ -81,14 +81,48 @@ describe('Translate', function() {
}, /An API key is required to use the Translate API\./);
});
+ it('should default baseUrl correctly', function() {
+ assert.strictEqual(
+ translate.baseUrl,
+ 'https://www.googleapis.com/language/translate/v2'
+ );
+ });
+
it('should localize the options', function() {
- var options = { key: API_KEY };
+ var options = { key: '...' };
var translate = new Translate(options);
assert.strictEqual(translate.options, options);
});
it('should localize the api key', function() {
- assert.equal(translate.key, API_KEY);
+ assert.equal(translate.key, OPTIONS.key);
+ });
+
+ describe('GOOGLE_CLOUD_TRANSLATE_ENDPOINT', function() {
+ var CUSTOM_ENDPOINT = '...';
+ var translate;
+
+ before(function() {
+ process.env.GOOGLE_CLOUD_TRANSLATE_ENDPOINT = CUSTOM_ENDPOINT;
+ translate = new Translate(OPTIONS);
+ });
+
+ after(function() {
+ delete process.env.GOOGLE_CLOUD_TRANSLATE_ENDPOINT;
+ });
+
+ it('should correctly set the baseUrl', function() {
+ assert.strictEqual(translate.baseUrl, CUSTOM_ENDPOINT);
+ });
+
+ it('should remove trailing slashes', function() {
+ var expectedBaseUrl = 'http://localhost:8080';
+
+ process.env.GOOGLE_CLOUD_TRANSLATE_ENDPOINT = 'http://localhost:8080//';
+
+ var translate = new Translate(OPTIONS);
+ assert.strictEqual(translate.baseUrl, expectedBaseUrl);
+ });
});
});
@@ -446,8 +480,8 @@ describe('Translate', function() {
'User-Agent': userAgent
}
});
- var BASE_URL = 'https://www.googleapis.com/language/translate/v2';
- expectedReqOpts.uri = BASE_URL + reqOpts.uri;
+
+ expectedReqOpts.uri = translate.baseUrl + reqOpts.uri;
makeRequestOverride = function(reqOpts, options, callback) {
assert.deepEqual(reqOpts, expectedReqOpts);