Skip to content

Commit a337a39

Browse files
author
Anton Savoskin
committed
feat(sync): add flag '--uploadTranslations'
1 parent 3feaec0 commit a337a39

File tree

6 files changed

+14
-10
lines changed

6 files changed

+14
-10
lines changed

src/base.ts

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ export abstract class Base extends Command {
4848
description: 'Provider`s namespace. Required for Locize',
4949
env: 'NAMESPACE',
5050
}),
51+
uploadTranslations: flags.boolean({
52+
description: 'Upload existing translations to provider. Useful for provider migration.',
53+
}),
5154
};
5255

5356
async init() {

src/commands/sync.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as path from 'path';
22

3-
import { asyncForEach, readFile, showError, showInfo, toHash, writeFile } from '../utils';
3+
import { asyncForEach, readFile, showError, showInfo, toHash, writeFile, head, tail } from '../utils';
44
import { Base } from '../base';
55
import { Lokalise } from '../providers/lokalise';
66
import { Provider } from '../providers/provider';
@@ -60,10 +60,10 @@ export default class Extract extends Base {
6060

6161
async run() {
6262
const {
63-
flags: { langs, provider, projectId, token, version, namespace },
63+
flags: { langs, provider, projectId, token, version, namespace, uploadTranslations },
6464
} = this.parse(Extract);
6565
const locales = langs.split(',');
66-
const defaultLocale = locales[0];
66+
const defaultLocale = head(locales);
6767

6868
const getProvider = () => {
6969
const providers: { [key: string]: any } = {
@@ -88,12 +88,11 @@ export default class Extract extends Base {
8888
const newMessages = this.provider.getNewMessages();
8989
if (newMessages.length > 0) {
9090
showInfo(`New translation keys: ${newMessages.length}`);
91-
if (provider === 'locize') {
92-
await asyncForEach(locales, locale =>
91+
await this.provider.uploadMessages(newMessages.map(id => this.messages[locales[0]][id]));
92+
if (uploadTranslations && locales.length > 1) {
93+
await asyncForEach(tail(locales), locale =>
9394
this.provider!.uploadMessages(newMessages.map(id => this.messages[locale][id]).filter(Boolean), locale),
9495
);
95-
} else {
96-
await this.provider.uploadMessages(newMessages.map(id => this.messages[locales[0]][id]), defaultLocale);
9796
}
9897
}
9998
}

src/providers/locize.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class Locize implements Provider {
4444
return '';
4545
}
4646

47-
async uploadMessages(messages: Message[], locale: string) {
47+
async uploadMessages(messages: Message[], locale = this.defaultLocale) {
4848
const headers = { Authorization: `Bearer ${this.apiKey}`, 'content-type': 'application/json' };
4949
const body = messages.reduce(
5050
(acc, { id, message, defaultMessage, description }) => {

src/providers/provider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import { Message } from '../types';
33
export interface Provider {
44
getKeys(locales: string[]): Promise<void>;
55
getMessage(locale: string, id: string): string;
6-
uploadMessages(messages: Message[], locale: string): Promise<void>;
6+
uploadMessages(messages: Message[], locale?: string): Promise<void>;
77
getNewMessages(): string[];
88
}

src/utils.ts

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export const toHash = <T>(array: T[], key: string): { [id: string]: T } =>
2828
(acc: { [id: string]: T }, data: T, index: number) => ((acc[key ? data[key] : index] = data), acc),
2929
{},
3030
);
31+
export const tail = <T>(arr: T[]) => (arr.length > 1 ? arr.slice(1) : arr);
32+
export const head = <T>(arr: T[]) => arr[0];
3133

3234
type Options = https.RequestOptions & {
3335
url: string;

test/commands/sync.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('sync locize', () => {
8585
.reply(200, locizeKeysJson),
8686
)
8787
.stderr()
88-
.command(['sync', '--messagesDir', messagesDir, '--provider', 'locize'])
88+
.command(['sync', '--messagesDir', messagesDir, '--provider', 'locize', '--uploadTranslations'])
8989
.it('upload new message to locize', ctx => {
9090
expect(ctx.stderr).toBe('');
9191
});

0 commit comments

Comments
 (0)