1
+ Param (
2
+ [Parameter (Mandatory = $true )][string ] $SourcesDirectory , # Directory where source files live; if using a Localize directory it should live in here
3
+ [string ] $LanguageSet = ' VS_Main_Languages' , # Language set to be used in the LocProject.json
4
+ [switch ] $UseCheckedInLocProjectJson , # When set, generates a LocProject.json and compares it to one that already exists in the repo; otherwise just generates one
5
+ [switch ] $CreateNeutralXlfs # Creates neutral xlf files. Only set to false when running locally
6
+ )
7
+
8
+ # Generates LocProject.json files for the OneLocBuild task. OneLocBuildTask is described here:
9
+ # https://ceapex.visualstudio.com/CEINTL/_wiki/wikis/CEINTL.wiki/107/Localization-with-OneLocBuild-Task
10
+
11
+ Set-StrictMode - Version 2.0
12
+ $ErrorActionPreference = " Stop"
13
+ . $PSScriptRoot \tools.ps1
14
+
15
+ Import-Module - Name (Join-Path $PSScriptRoot ' native\CommonLibrary.psm1' )
16
+
17
+ $exclusionsFilePath = " $SourcesDirectory \Localize\LocExclusions.json"
18
+ $exclusions = @ { Exclusions = @ () }
19
+ if (Test-Path - Path $exclusionsFilePath )
20
+ {
21
+ $exclusions = Get-Content " $exclusionsFilePath " | ConvertFrom-Json
22
+ }
23
+
24
+ Push-Location " $SourcesDirectory " # push location for Resolve-Path -Relative to work
25
+
26
+ # Template files
27
+ $jsonFiles = @ ()
28
+ $jsonFiles += Get-ChildItem - Recurse - Path " $SourcesDirectory " | Where-Object { $_.FullName -Match " \.template\.config\\localize\\en\..+\.json" } # .NET templating pattern
29
+ $jsonFiles += Get-ChildItem - Recurse - Path " $SourcesDirectory " | Where-Object { $_.FullName -Match " en\\strings\.json" } # current winforms pattern
30
+
31
+ $xlfFiles = @ ()
32
+
33
+ $allXlfFiles = Get-ChildItem - Recurse - Path " $SourcesDirectory \*\*.xlf"
34
+ $langXlfFiles = @ ()
35
+ if ($allXlfFiles ) {
36
+ $null = $allXlfFiles [0 ].FullName -Match " \.([\w-]+)\.xlf" # matches '[langcode].xlf'
37
+ $firstLangCode = $Matches.1
38
+ $langXlfFiles = Get-ChildItem - Recurse - Path " $SourcesDirectory \*\*.$firstLangCode .xlf"
39
+ }
40
+ $langXlfFiles | ForEach-Object {
41
+ $null = $_.Name -Match " (.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf
42
+
43
+ $destinationFile = " $ ( $_.Directory.FullName ) \$ ( $Matches.1 ) .xlf"
44
+ $xlfFiles += Copy-Item " $ ( $_.FullName ) " - Destination $destinationFile - PassThru
45
+ }
46
+
47
+ $locFiles = $jsonFiles + $xlfFiles
48
+
49
+ $locJson = @ {
50
+ Projects = @ (
51
+ @ {
52
+ LanguageSet = $LanguageSet
53
+ LocItems = @ (
54
+ $locFiles | ForEach-Object {
55
+ $outputPath = " $ ( ($_.DirectoryName | Resolve-Path - Relative) + " \" ) "
56
+ $continue = $true
57
+ foreach ($exclusion in $exclusions.Exclusions ) {
58
+ if ($outputPath.Contains ($exclusion ))
59
+ {
60
+ $continue = $false
61
+ }
62
+ }
63
+ $sourceFile = ($_.FullName | Resolve-Path - Relative)
64
+ if (! $CreateNeutralXlfs -and $_.Extension -eq ' .xlf' ) {
65
+ Remove-Item - Path $sourceFile
66
+ }
67
+ if ($continue )
68
+ {
69
+ return @ {
70
+ SourceFile = $sourceFile
71
+ CopyOption = " LangIDOnName"
72
+ OutputPath = $outputPath
73
+ }
74
+ }
75
+ }
76
+ )
77
+ }
78
+ )
79
+ }
80
+
81
+ $json = ConvertTo-Json $locJson - Depth 5
82
+ Write-Host " LocProject.json generated:`n`n $json `n`n "
83
+ Pop-Location
84
+
85
+ if (! $UseCheckedInLocProjectJson ) {
86
+ New-Item " $SourcesDirectory \Localize\LocProject.json" - Force # Need this to make sure the Localize directory is created
87
+ Set-Content " $SourcesDirectory \Localize\LocProject.json" $json
88
+ }
89
+ else {
90
+ New-Item " $SourcesDirectory \Localize\LocProject-generated.json" - Force # Need this to make sure the Localize directory is created
91
+ Set-Content " $SourcesDirectory \Localize\LocProject-generated.json" $json
92
+
93
+ if ((Get-FileHash " $SourcesDirectory \Localize\LocProject-generated.json" ).Hash -ne (Get-FileHash " $SourcesDirectory \Localize\LocProject.json" ).Hash) {
94
+ Write-PipelineTelemetryError - Category " OneLocBuild" - Message " Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them."
95
+
96
+ exit 1
97
+ }
98
+ else {
99
+ Write-Host " Generated LocProject.json and current LocProject.json are identical."
100
+ }
101
+ }
0 commit comments