or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

cli-extraction.mdindex.mdmessage-bundle.mdserializers.mdtranslation-service.md

serializers.mddocs/

0

# Translation File Serializers

1

2

Serializers for generating translation files in multiple formats: XLIFF, XLIFF2, XMB, and XTB.

3

4

## Capabilities

5

6

### XLIFF Serializer

7

8

Generates XLIFF 1.2 format translation files, the default format used by Angular i18n.

9

10

```typescript { .api }

11

/**

12

* Generates XLIFF 1.2 format translation file content

13

* @param messages - Array of i18n messages to serialize

14

* @param locale - Target locale for the translation file

15

* @param existingNodes - Optional existing XML nodes to merge with

16

* @returns XLIFF XML content as string

17

*/

18

function xliffWrite(

19

messages: i18n.Message[],

20

locale: string | null,

21

existingNodes?: xml.Node[]

22

): string;

23

24

/**

25

* Loads XLIFF content and converts to i18n messages

26

* @param content - XLIFF XML content string

27

* @returns Object mapping message IDs to translated strings

28

*/

29

function xliffLoadToI18n(content: string): I18nMessagesById;

30

31

/**

32

* Loads XLIFF content to XML nodes

33

* @param content - XLIFF XML content string

34

* @returns Object mapping message IDs to XML nodes

35

*/

36

function xliffLoadToXml(content: string): XmlMessagesById;

37

38

/**

39

* Generates digest/hash for XLIFF message identification

40

* @param message - Message to generate digest for

41

* @returns Message digest string

42

*/

43

function xliffDigest(message: i18n.Message): string;

44

```

45

46

### XLIFF2 Serializer

47

48

Generates XLIFF 2.0/2.1 format translation files with improved features and structure.

49

50

```typescript { .api }

51

/**

52

* Generates XLIFF 2.0 format translation file content

53

* @param messages - Array of i18n messages to serialize

54

* @param locale - Target locale for the translation file

55

* @param existingNodes - Optional existing XML nodes to merge with

56

* @returns XLIFF2 XML content as string

57

*/

58

function xliff2Write(

59

messages: i18n.Message[],

60

locale: string | null,

61

existingNodes?: xml.Node[]

62

): string;

63

64

/**

65

* Loads XLIFF2 content and converts to i18n messages

66

* @param content - XLIFF2 XML content string

67

* @returns Object mapping message IDs to translated strings

68

*/

69

function xliff2LoadToI18n(content: string): I18nMessagesById;

70

71

/**

72

* Loads XLIFF2 content to XML nodes

73

* @param content - XLIFF2 XML content string

74

* @returns Object mapping message IDs to XML nodes

75

*/

76

function xliff2LoadToXml(content: string): XmlMessagesById;

77

78

/**

79

* Generates digest/hash for XLIFF2 message identification

80

* @param message - Message to generate digest for

81

* @returns Message digest string

82

*/

83

function xliff2Digest(message: i18n.Message): string;

84

```

85

86

### XMB Serializer

87

88

Generates XMB (XML Message Bundle) format files, Angular's internal message bundle format.

89

90

```typescript { .api }

91

/**

92

* Generates XMB format translation file content

93

* @param messages - Array of i18n messages to serialize

94

* @param locale - Target locale for the translation file

95

* @param existingNodes - Optional existing XML nodes to merge with

96

* @returns XMB XML content as string

97

*/

98

function xmbWrite(

99

messages: i18n.Message[],

100

locale: string | null,

101

existingNodes?: xml.Node[]

102

): string;

103

104

/**

105

* Loads XMB content to XML nodes

106

* @param content - XMB XML content string

107

* @returns Object mapping message IDs to XML nodes

108

*/

109

function xmbLoadToXml(content: string): XmlMessagesById;

110

111

/**

112

* Generates digest/hash for XMB message identification

113

* @param message - Message to generate digest for

114

* @returns Message digest string

115

*/

116

function xmbDigest(message: i18n.Message): string;

117

118

/**

119

* Creates placeholder mapper for XMB format

120

* @param message - Message to create mapper for

121

* @returns Placeholder mapper instance

122

*/

123

function xmbMapper(message: i18n.Message): PlaceholderMapper;

124

```

125

126

### XTB Serializer

127

128

Handles XTB (XML Translation Bundle) format, used for translated message files.

129

130

```typescript { .api }

131

/**

132

* Loads XTB content and converts to i18n messages

133

* @param content - XTB XML content string

134

* @returns Object mapping message IDs to translated strings

135

*/

136

function xtbLoadToI18n(content: string): I18nMessagesById;

137

138

/**

139

* Generates digest/hash for XTB message identification

140

* @param message - Message to generate digest for

141

* @returns Message digest string

142

*/

143

function xtbDigest(message: i18n.Message): string;

144

145

/**

146

* Creates placeholder mapper for XTB format

147

* @param message - Message to create mapper for

148

* @returns Placeholder mapper instance

149

*/

150

function xtbMapper(message: i18n.Message): PlaceholderMapper;

151

```

152

153

### Core Serializer Utilities

154

155

Common utilities used across all serializer formats.

156

157

```typescript { .api }

158

/**

159

* Serializes HTML nodes to string with locale-specific formatting

160

* @param nodes - HTML nodes to serialize

161

* @param locale - Target locale string

162

* @param params - Interpolation parameters

163

* @returns Array of serialized node strings

164

*/

165

function serializeNodes(

166

nodes: html.Node[],

167

locale: string,

168

params: {[key: string]: any}

169

): string[];

170

171

/**

172

* Default placeholder mapper implementation

173

*/

174

class SimplePlaceholderMapper implements PlaceholderMapper {

175

constructor(message: i18n.Message, placeholderNames: string[]);

176

toPublicName(internalName: string): string | null;

177

toInternalName(publicName: string): string | null;

178

}

179

```

180

181

## Format Comparison

182

183

| Feature | XLIFF 1.2 | XLIFF 2.0 | XMB | XTB |

184

|---------|-----------|-----------|-----|-----|

185

| **Use Case** | Standard translation exchange | Modern translation exchange | Angular source messages | Angular translated messages |

186

| **File Extension** | .xlf | .xlf2 | .xmb | .xtb |

187

| **Angular Default** | ✅ Yes | ❌ No | ❌ No | ❌ No |

188

| **Industry Standard** | ✅ Yes | ✅ Yes | ❌ No | ❌ No |

189

| **Translation Memory** | ✅ Yes | ✅ Yes | ❌ No | ❌ No |

190

| **Metadata Support** | ✅ Good | ✅ Excellent | ✅ Basic | ✅ Basic |

191

192

## Usage Examples

193

194

### Basic XLIFF Generation

195

196

```typescript

197

import { xliffWrite } from "@ngx-translate/i18n-polyfill/serializers";

198

import { MessageBundle } from "@ngx-translate/i18n-polyfill/extractor";

199

200

// Create message bundle and add messages

201

const bundle = new MessageBundle("en");

202

bundle.updateFromTemplate("Hello {{name}}", "app.component.ts");

203

bundle.updateFromTemplate({

204

value: "Welcome to our app",

205

id: "welcome.message",

206

description: "Main welcome message"

207

}, "app.component.ts");

208

209

// Generate XLIFF content

210

const messages = bundle.getMessages();

211

const xliffContent = xliffWrite(messages, "en");

212

213

console.log(xliffContent);

214

// Output: XLIFF XML with translation units

215

```

216

217

### Loading and Merging Translation Files

218

219

```typescript

220

import { xliffLoadToI18n, xliffWrite } from "@ngx-translate/i18n-polyfill/serializers";

221

222

// Load existing translations

223

const existingTranslations = xliffLoadToI18n(existingXliffContent);

224

225

// Add new messages and merge

226

const newMessages = extractedMessagesFromCode;

227

const mergedContent = xliffWrite(newMessages, "en", existingNodes);

228

```

229

230

### Multi-Format Export

231

232

```typescript

233

import { xliffWrite, xliff2Write, xmbWrite } from "@ngx-translate/i18n-polyfill/serializers";

234

235

// Export same messages to different formats

236

const messages = bundle.getMessages();

237

238

const xliffOutput = xliffWrite(messages, "en");

239

const xliff2Output = xliff2Write(messages, "en");

240

const xmbOutput = xmbWrite(messages, "en");

241

242

// Save to different files

243

fs.writeFileSync("messages.xlf", xliffOutput);

244

fs.writeFileSync("messages.xlf2", xliff2Output);

245

fs.writeFileSync("messages.xmb", xmbOutput);

246

```

247

248

## Message Digests

249

250

Each format uses digest functions to generate unique identifiers for messages:

251

252

- **Purpose**: Stable message IDs that remain consistent across extractions

253

- **Algorithm**: Based on message content, meaning, and description

254

- **Usage**: Links source messages to their translations across different files

255

256

```typescript

257

import { xliffDigest, xliff2Digest, xmbDigest } from "@ngx-translate/i18n-polyfill/serializers";

258

259

const message = createI18nMessage("Hello {{name}}", "greeting");

260

261

const xliffId = xliffDigest(message); // e.g., "2345678901234567890"

262

const xliff2Id = xliff2Digest(message); // e.g., "3456789012345678901"

263

const xmbId = xmbDigest(message); // e.g., "4567890123456789012"

264

```

265

266

## Placeholder Mapping

267

268

XMB and XTB formats use placeholder mappers to handle interpolation parameters:

269

270

```typescript

271

import { xmbMapper, xtbMapper } from "@ngx-translate/i18n-polyfill/serializers";

272

273

const message = createI18nMessage("Hello {{name}}, you have {{count}} items");

274

const mapper = xmbMapper(message);

275

276

// Map internal placeholder names to public names

277

const publicName = mapper.toPublicName("INTERPOLATION"); // "name"

278

const internalName = mapper.toInternalName("count"); // "INTERPOLATION_1"

279

```