-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
anatolybolshakov
committed
Nov 15, 2021
1 parent
1280b6a
commit 54bb953
Showing
2,179 changed files
with
106,364 additions
and
52,959 deletions.
There are no files selected for viewing
Binary file added
BIN
+6.29 MB
OneLocBuild/packages/LSBuild.XLoc.7.1.40330/LSBuild.XLoc.7.1.40330.nupkg
Binary file not shown.
384 changes: 384 additions & 0 deletions
384
OneLocBuild/packages/LSBuild.XLoc.7.1.40330/tools/netfx/AndroidXML.ps1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,384 @@ | ||
<# | ||
.DESCRIPTION | ||
Resource parser for Android .xml files. | ||
.SYNOPSIS | ||
.PARAMETER | ||
Hidden parameters from the AnyParse host. | ||
[string]$filePath # Path of the file to be read/write. | ||
[int]$parentDbid # Internal parent id to create content nodes. | ||
[int]$langIDSrc # Source language lcid. | ||
[CultureInfo]$langCultureInfoSrc # Source language CultureInfo. | ||
[int]$langIDTgt # Target language lcid. | ||
[CultureInfo]$langCultureInfoTgt # Target language CultureInfo. | ||
[bool]$isGenerating # True if generating the target file. | ||
.LINK | ||
https://osgwiki.com/wiki/AnyParse | ||
.NOTES | ||
02/2021 | ||
mailto:[email protected]?subject=AnyParse | ||
#> | ||
|
||
<# | ||
# Debug | ||
# | ||
# Default output file gets deleted by the parser. | ||
$filePath = "D:\test\android\Android_strings.xml" | ||
$debugFilePath = "$($filePath).debug.xml" | ||
Copy-Item $filePath -Destination $debugFilePath | ||
$filePath = $debugFilePath | ||
$isGenerating = $true | ||
class ParserStub { | ||
[void]SubmitNode([ref]$parentDBID, [int]$displayParent, [nullable[int]]$numResType, [string]$strResType, [string]$nodeName, [bool]$isExpandable, [bool]$visible, $iconType) { | ||
} | ||
[string]SubmitResource([int]$parentDBID, [nullable[int]]$numResType, [string]$strResType, [nullable[int]]$numResID, [string]$strResID, [string]$resStr, [string]$comment, [string]$termNote, [bool]$isGenerating) { | ||
Write-Host "Comment='$comment'" | ||
Write-Host "id='$strResID', text='$resStr'" | ||
return "[😺 $([char]0x2122) (tm) ソボミダゾ$resStr !!! !!! !!! ]" | ||
} | ||
[void]LogInfo([string]$msg) { | ||
Write-Host "Info: $msg" | ||
} | ||
[void]LogWarning([string]$msg) { | ||
Write-Host "Warning: $msg" | ||
} | ||
[void]LogError([string]$msg) { | ||
Write-Host "Error: $msg" | ||
} | ||
} | ||
Add-Type @' | ||
namespace ManagedLSOM | ||
{ | ||
public class ELSIconType | ||
{ | ||
public static int elsIconString = 9; | ||
} | ||
} | ||
'@ | ||
$this = New-Object ParserStub | ||
$langCultureInfoTgt = [System.Globalization.CultureInfo]::GetCultureInfo(1025) # 1025=ar-SA, 1041=ja-JP | ||
$langIDTgt = $langCultureInfoTgt.LCID | ||
$ScriptRoot = "." | ||
#> | ||
|
||
Add-Type -Path $ScriptRoot/ICUParserLib.dll | ||
|
||
# Setup variables. | ||
# Regex for the char limit instruction. | ||
[string]$maxLengthRegex = '\[\s*CHAR.LIMIT\s*=\s*(?<MaxLength>\d+)\s*\]' | ||
|
||
# Additional help strings to be added for plural resources. | ||
$androidPluralHelpStrings = @{ | ||
zero = "NOTE: Leave this value the same as 'other' if the language does not require special treatment for it. When the language requires special treatment of the number 0 (as in Arabic)." | ||
one = "NOTE: When the language requires special treatment of numbers like one (as with the number 1 in English and most other languages; in Russian, any number ending in 1 but not ending in 11 is in this class)." | ||
two = "NOTE: When the language requires special treatment of numbers like two (as with 2 in Welsh, or 102 in Slovenian)." | ||
few = "NOTE: When the language requires special treatment of small numbers (as with 2, 3, and 4 in Czech; or numbers ending 2, 3, or 4 but not 12, 13, or 14 in Polish)." | ||
many = "NOTE: When the language requires special treatment of large numbers (as with numbers ending 11-99 in Maltese)." | ||
other = "NOTE: When the language does not require special treatment of the given quantity (as with all numbers in Chinese, or 42 in English)." | ||
} | ||
|
||
<# | ||
.DESCRIPTION | ||
Submit item. | ||
Preserve CDATA structure of the resource. | ||
#> | ||
function Submit-Item( | ||
[int]$childDbid, | ||
[System.Xml.XmlDocument]$xml, | ||
[System.Xml.XmlElement]$readNode, | ||
[System.Xml.XmlElement]$writeNode, | ||
[string]$stringId, | ||
[string]$text, | ||
[string]$devComment, | ||
[bool]$isGenerating | ||
) { | ||
$text = $this.SubmitResource($childDbid, 42, "XML:Text", 0, $stringId, $text, $devComment, "", $isGenerating) -replace "(?<!\\)'", "\'" # add escaping to single apostrophe | ||
|
||
if ($isGenerating) { | ||
try { | ||
# Preserve CDATA structure of the resource. | ||
if ($readNode.HasChildNodes -and $readNode.ChildNodes[0].NodeType -eq "CDATA") { | ||
$writeNode.InnerXml = $xml.CreateCDataSection($text).OuterXml | ||
} | ||
else { | ||
$writeNode.InnerXml = $text | ||
} | ||
} | ||
catch { | ||
throw [System.IO.InvalidDataException] "Invalid translation for resourceID '$stringId'`nTranslation: '$text'`nTargetculture: '$($langCultureInfoTgt.Name)'`nFilename: '$filePath'`nError: '$_'" | ||
} | ||
} | ||
} | ||
|
||
<# | ||
.DESCRIPTION | ||
Gets the src item. | ||
#> | ||
function Get-SrcItem([System.Xml.XmlElement]$node) { | ||
# Support CDATA tags in Android. | ||
if ($node.HasChildNodes -and $node.ChildNodes[0].NodeType -eq "CDATA") { | ||
$node.InnerText | ||
} | ||
else { | ||
$node.InnerXml | ||
} | ||
} | ||
|
||
<# | ||
.DESCRIPTION | ||
Gets the individual comment for the node. | ||
#> | ||
function Get-IndividualComment([System.Xml.XmlElement]$node) { | ||
if ($node.NextSibling.NodeType -eq "Comment") { | ||
return " | " + $node.NextSibling.value.trim() | ||
} | ||
elseif ($node.NextSibling.NodeType -eq "Whitespace" -and | ||
-not $node.NextSibling.value.Contains("`n") -and | ||
$node.NextSibling.NextSibling.NodeType -eq "Comment" ) { | ||
return " | " + $node.NextSibling.NextSibling.value.trim() | ||
} | ||
"" | ||
} | ||
|
||
<# | ||
.DESCRIPTION | ||
Gets the comment and converts the optional CHAR_LIMIT to a LocVer instruction. | ||
#> | ||
function Get-Comment([string]$text, [string]$devComment) { | ||
# Protect content tags. | ||
[System.Text.RegularExpressions.MatchCollection]$tags = ([regex]::Matches($text, '<.+?>')) | ||
|
||
# Check if CHAR_LIMIT is used. | ||
[int]$maxLengthValue = -1 | ||
if ($devComment -match $maxLengthRegex) { | ||
[string]$maxLength = $matches['MaxLength'] | ||
$maxLengthValue = [int]$maxLength | ||
|
||
# Add the length of the placeholders to the CHAR_LIMIT value as the new MaxLength instruction. | ||
if ($maxLengthValue -gt 0) { | ||
# Remove CHAR_LIMIT | ||
$devComment = $devComment -replace $maxLengthRegex, "" | ||
|
||
[int]$tagsLength = $maxLengthValue | ||
$tags | % { $tagsLength += $_.Length } | ||
if ($tagsLength -gt 0) { | ||
$devComment += " {MaxLength=$tagsLength}" | ||
} | ||
} | ||
} | ||
|
||
# Add LocVer Placeholder instructions for the tags. | ||
$tagsUnique = $tags | Select-Object -unique | ||
[string]$placeholder = $tagsUnique | % { " {Placeholder=`"$_`"}" } | ||
$devComment + $placeholder | ||
} | ||
|
||
# Read the android .xml file. | ||
[xml]$xml = New-Object xml | ||
$xml.PreserveWhitespace = $true | ||
$xml.Load($filePath) | ||
|
||
# Debug: save copy with the default formatting to simplify compare with the generated file. | ||
#$xml.Save($filePath + ".formatted.xml") | ||
|
||
# Create the parent '<string>' node. | ||
[int]$childDbid = $parentDbid | ||
$this.SubmitNode([ref]$childDbid, 0, 0, $null, "<string>", $true, $true, [ManagedLSOM.ELSIconType]::elsIconString) | ||
|
||
# Select all child nodes. | ||
$stringNodes = $xml.SelectNodes("/resources/child::node()") | ||
|
||
# Support group comment headers. | ||
[string]$groupComment = "" | ||
|
||
# Enumerate each node and get the loc content. | ||
foreach ($stringNode in $stringNodes) { | ||
#$this.LogInfo($groupComment) | ||
|
||
# Skip whitespace nodes. | ||
if ($stringNode.NodeType -eq "Whitespace") { | ||
continue | ||
} | ||
|
||
# Add group comment to dev comments. | ||
# Group comment is defined by a leading line: | ||
# <!-- group comment1 --> | ||
# <string name="action_settings">Settings</string> | ||
if ($stringNode.NodeType -eq "Comment" -and | ||
$stringNode.PreviousSibling.NodeType -eq "Whitespace" -and | ||
$stringNode.PreviousSibling.value.Contains("`n") | ||
) { | ||
$groupComment = $stringNode.value.trim() | ||
continue | ||
} | ||
|
||
# Skip nodes with the translatable attribute set to false. | ||
if ($stringNode."translatable" -eq "false") { | ||
continue | ||
} | ||
|
||
if ($stringNode.LocalName -eq "string") { | ||
|
||
# Get resource id from the name attribute. | ||
[string]$stringId = $stringNode."name" | ||
|
||
# Get source text. | ||
[string]$text = Get-SrcItem $stringNode | ||
|
||
# Get dev comment. | ||
[string]$devComment = Get-Comment $text $stringNode."comment" | ||
|
||
if ($groupComment) { | ||
$devComment += " | " + $groupComment | ||
} | ||
|
||
# Add individual comment. | ||
# Individual comment follows directly the content node: | ||
# <string name="action_manage_accounts">Manage Accounts</string><!-- individual comment --> | ||
$devComment += Get-IndividualComment $stringNode | ||
|
||
# Submit item. | ||
Submit-Item $childDbid $xml $stringNode $stringNode $stringId $text $devComment $isGenerating | ||
} | ||
elseif ($stringNode.LocalName -eq "string-array") { | ||
|
||
# Get resource id from the name attribute. | ||
[string]$stringId = $stringNode."name" | ||
|
||
# Get dev comment. | ||
[string]$comment = $stringNode."comment" | ||
|
||
# array ids start with 1 | ||
[int]$arrayId = 1 | ||
foreach ($childNode in $stringNode.SelectNodes("item")) { | ||
# Compose the item id from the parent id and the array id. | ||
[string]$itemStringId = "string-array_$($stringId)_$($arrayId)" | ||
$arrayId++ | ||
|
||
# Get item source text. | ||
[string]$itemText = Get-SrcItem $childNode | ||
|
||
# Get dev comment. | ||
[string]$devComment = "$($itemStringId). For item: $($itemText)" + (Get-Comment $itemText $comment) | ||
|
||
# Get item dev comment. | ||
[string]$itemDevComment = $devComment | ||
[string]$itemComment = $childNode."comment" | ||
|
||
if ($itemComment) { | ||
$itemDevComment += " | " + $itemComment | ||
} | ||
|
||
if ($groupComment) { | ||
$itemDevComment += " | " + $groupComment | ||
} | ||
|
||
# Add individual comment. | ||
# Individual comment follows directly the content node: | ||
# <string name="action_manage_accounts">Manage Accounts</string><!-- individual comment --> | ||
$itemDevComment += Get-IndividualComment $childNode | ||
|
||
# Submit item. | ||
Submit-Item $childDbid $xml $childNode $childNode $itemStringId $itemText $itemDevComment $isGenerating | ||
} | ||
} | ||
elseif ($stringNode.LocalName -eq "plurals") { | ||
|
||
# Get resource id from the name attribute. | ||
[string]$stringId = $stringNode."name" | ||
|
||
# Get comment from the comment attribute. | ||
[string]$comment = $stringNode."comment" | ||
|
||
# Get the node 'other' for the data type. | ||
[System.Xml.XmlElement]$itemOtherNode = $stringNode.SelectSingleNode("item[@quantity='other']") | ||
if (-not $itemOtherNode) { | ||
$this.LogError("The resource with id '$stringId' does not have the required quantity attribute 'other'.") | ||
return | ||
} | ||
|
||
# Store the current plurals. | ||
[hashtable]$pluralMap = @{} | ||
|
||
foreach ($childNode in $stringNode.SelectNodes("item")) { | ||
# Get resource id from the quantity attribute. | ||
[string]$quantity = $childNode."quantity" | ||
|
||
# Get item source text. | ||
[string]$itemText = Get-SrcItem $childNode | ||
|
||
$pluralMap[$quantity] = $itemText | ||
|
||
# Keep the plural 'other'. | ||
if ($isGenerating -and $quantity -ne "other") { | ||
[void]($stringNode.RemoveChild($childNode)) | ||
} | ||
} | ||
|
||
# Expand the plural list. | ||
[System.Globalization.CultureInfo]$language = $null | ||
if ($isGenerating) { | ||
$language = $langCultureInfoTgt | ||
} | ||
|
||
$messageItems = [ICUParserLib.ICUParser]::ExpandPlurals($pluralMap, $language) | ||
foreach ($messageItem in $messageItems) { | ||
[string]$text = $messageItem.Text | ||
[string]$quantity = $messageItem.ResourceId | ||
|
||
# Compose the item id from the parent id and the array id. | ||
[string]$itemStringId = "plurals_$($stringId)_$($quantity)" | ||
|
||
# Get dev comment. | ||
[string]$devComment = Get-Comment $text $comment | ||
|
||
# Compose the item dev comment. | ||
[string]$helpString = $androidPluralHelpStrings[$quantity] | ||
[string]$itemDevComment = "Variant of plurals: $stringId. For amount: $quantity. $helpString $devComment" | ||
|
||
# Add language specific lock. | ||
if ($messageItem.Data) { | ||
$itemDevComment += " (ICU){Locked=$($messageItem.Data)}" | ||
} | ||
|
||
# Add group comment. | ||
if ($groupComment) { | ||
$itemDevComment += " | " + $groupComment | ||
} | ||
|
||
# Add the plural. | ||
[System.Xml.XmlElement]$newItemNode = $itemOtherNode | ||
if ($quantity -ne "other") { | ||
$newItemNode = $xml.CreateElement("item") | ||
$newItemNode.SetAttribute("quantity", $quantity) | ||
[void]($stringNode.InsertBefore($newItemNode, $itemOtherNode)) | ||
} | ||
|
||
# Submit item. | ||
Submit-Item $childDbid $xml $itemOtherNode $newItemNode $itemStringId $text $itemDevComment $isGenerating | ||
} | ||
} | ||
} | ||
|
||
if ($isGenerating) { | ||
|
||
# Remove all non translatable strings. | ||
$nonTranslatableNodes = $xml.SelectNodes("//string[@translatable='false']") | ||
foreach ($nonTranslatableNode in $nonTranslatableNodes) { | ||
[void]($nonTranslatableNode.ParentNode.RemoveChild($nonTranslatableNode)) | ||
} | ||
|
||
$xml.Save($filePath) | ||
} |
Binary file added
BIN
+213 KB
OneLocBuild/packages/LSBuild.XLoc.7.1.40330/tools/netfx/Antlr4.Runtime.Standard.dll
Binary file not shown.
Binary file added
BIN
+9 KB
OneLocBuild/packages/LSBuild.XLoc.7.1.40330/tools/netfx/AnyParse.PoParser.dll
Binary file not shown.
Binary file not shown.
Binary file added
BIN
+3.06 KB
OneLocBuild/packages/LSBuild.XLoc.7.1.40330/tools/netfx/AppInsight_noJSTS.LSS
Binary file not shown.
Oops, something went wrong.