Skip to content

Commit d54d08b

Browse files
authored
fix: Add Enum and class-name support (#191)
* fix: Add Enum support * fix: Add support for classes.
1 parent 4b851ea commit d54d08b

File tree

4 files changed

+80
-14
lines changed

4 files changed

+80
-14
lines changed

src/loader.ts

+38-14
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@ import path from 'path'
33
import { Engine } from 'php-parser'
44
import { ParsedLangFileInterface } from './interfaces/parsed-lang-file'
55

6+
const toCamelCase = (str: string): string => {
7+
if (str === str.toUpperCase()) {
8+
return str.toLowerCase()
9+
}
10+
11+
return str.replace(/^\w/, (c) => c.toLowerCase())
12+
}
13+
614
export const hasPhpTranslations = (folderPath: string): boolean => {
715
folderPath = folderPath.replace(/[\\/]$/, '') + path.sep
816

@@ -51,14 +59,16 @@ export const parseAll = (folderPath: string): ParsedLangFileInterface[] => {
5159
}
5260

5361
// If data contains an object with folder name 'vendor'
54-
const vendorIndex = data.findIndex(({ folder }) => folder === 'vendor');
62+
const vendorIndex = data.findIndex(({ folder }) => folder === 'vendor')
5563

5664
if (vendorIndex !== -1) {
57-
const vendorTranslations = data[vendorIndex].translations;
58-
data.splice(vendorIndex, 1);
65+
const vendorTranslations = data[vendorIndex].translations
66+
data.splice(vendorIndex, 1)
5967

60-
data.forEach(langFile =>
61-
langFile.translations = mergeVendorTranslations(langFile.folder, langFile.translations, vendorTranslations));
68+
data.forEach(
69+
(langFile) =>
70+
(langFile.translations = mergeVendorTranslations(langFile.folder, langFile.translations, vendorTranslations))
71+
)
6272
}
6373

6474
return data
@@ -75,16 +85,18 @@ export const parseAll = (folderPath: string): ParsedLangFileInterface[] => {
7585

7686
function mergeVendorTranslations(folder: string, translations: any, vendorTranslations: any) {
7787
// Filter the translations from the vendor file that match the current folder
78-
const langTranslationsFromVendor = Object
79-
.entries(vendorTranslations)
88+
const langTranslationsFromVendor = Object.entries(vendorTranslations)
8089
.filter(([key]) => key.includes(`.${folder}.`))
81-
.reduce((acc, [key, value]) => ({
82-
...acc,
83-
[key.replace(`.${folder}.`, '::')]: value,
84-
}), {});
90+
.reduce(
91+
(acc, [key, value]) => ({
92+
...acc,
93+
[key.replace(`.${folder}.`, '::')]: value
94+
}),
95+
{}
96+
)
8597

8698
// Merge the vendor translations that matched the folder with the current translations
87-
return { ...translations, ...langTranslationsFromVendor };
99+
return { ...translations, ...langTranslationsFromVendor }
88100
}
89101

90102
export const parse = (content: string) => {
@@ -121,7 +133,19 @@ const parseItem = (expr) => {
121133
}
122134

123135
if (expr.key) {
124-
return { [expr.key.value]: parseItem(expr.value) }
136+
let key = expr.key.value
137+
138+
if (expr.key.kind === 'staticlookup') {
139+
if (expr.key.offset.name === 'class') {
140+
key = toCamelCase(expr.key.what.name)
141+
} else {
142+
key = toCamelCase(expr.key.offset.name)
143+
}
144+
} else if (expr.key.kind === 'propertylookup') {
145+
key = toCamelCase(expr.key.what.offset.name)
146+
}
147+
148+
return { [key]: parseItem(expr.value) }
125149
}
126150

127151
return parseItem(expr.value)
@@ -181,7 +205,7 @@ export const readThroughDir = (dir) => {
181205
}
182206

183207
export const prepareExtendedParsedLangFiles = (langPaths: string[]): ParsedLangFileInterface[] =>
184-
langPaths.flatMap(langPath => parseAll(langPath));
208+
langPaths.flatMap((langPath) => parseAll(langPath))
185209

186210
export const generateFiles = (langPath: string, data: ParsedLangFileInterface[]): ParsedLangFileInterface[] => {
187211
data = mergeData(data)

test/fixtures/lang/en/classnames.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
class SomeClass
4+
{
5+
const NAME = 'name';
6+
}
7+
8+
return [
9+
SomeClass::class => 'Some Class',
10+
SomeClass::NAME => 'Name',
11+
];

test/fixtures/lang/en/enums.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
enum Status
4+
{
5+
case New = 'new';
6+
case InProgress = 'in_progress';
7+
case Finished = 'finished';
8+
}
9+
10+
return [
11+
Status::class => [
12+
Status::New->value => 'New',
13+
Status::InProgress->value => 'In Progress',
14+
Status::Finished->value => 'Finished',
15+
],
16+
];

test/loader.test.ts

+15
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,21 @@ it('transforms simple index array to .json', () => {
126126
expect(lang['arr.1']).toBe('bar');
127127
});
128128

129+
it('transforms enum values to .json', () => {
130+
const lang = parse(fs.readFileSync(isolatedFixtures + '/lang/en/enums.php').toString());
131+
132+
expect(lang['status.new']).toBe('New');
133+
expect(lang['status.inProgress']).toBe('In Progress');
134+
expect(lang['status.finished']).toBe('Finished');
135+
});
136+
137+
it('transforms class names and consts to .json', () => {
138+
const lang = parse(fs.readFileSync(isolatedFixtures + '/lang/en/classnames.php').toString());
139+
140+
expect(lang['someClass']).toBe('Some Class');
141+
expect(lang['name']).toBe('Name');
142+
});
143+
129144
it('ignores empty `array` or `null` translations', () => {
130145
const lang = parse(fs.readFileSync(isolatedFixtures + '/lang/en/ignore.php').toString());
131146

0 commit comments

Comments
 (0)