diff --git a/build/build.ps1 b/build/build.ps1
index 3ba347a6..784e4bb9 100644
--- a/build/build.ps1
+++ b/build/build.ps1
@@ -1,546 +1,108 @@
- param (
- # get, don't execute
- [Parameter(Mandatory=$false)]
- [Alias("g")]
- [switch] $get = $false,
-
- # run local, don't download, assume everything is ready
- [Parameter(Mandatory=$false)]
- [Alias("l")]
- [Alias("loc")]
- [switch] $local = $false,
-
- # enable docfx
- [Parameter(Mandatory=$false)]
- [Alias("doc")]
- [switch] $docfx = $false,
-
- # keep the build directories, don't clear them
- [Parameter(Mandatory=$false)]
- [Alias("c")]
- [Alias("cont")]
- [switch] $continue = $false,
-
- # execute a command
- [Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)]
- [String[]]
- $command
- )
-
- # ################################################################
- # BOOTSTRAP
- # ################################################################
-
- # create and boot the buildsystem
- $ubuild = &"$PSScriptRoot\build-bootstrap.ps1"
- if (-not $?) { return }
- $ubuild.Boot($PSScriptRoot,
- @{ Local = $local; WithDocFx = $docfx },
- @{ Continue = $continue })
- if ($ubuild.OnError()) { return }
-
- Write-Host "Umbraco Cms Build"
- Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
-
- # ################################################################
- # TASKS
- # ################################################################
-
- $ubuild.DefineMethod("SetMoreUmbracoVersion",
- {
- param ( $semver )
-
- $release = "" + $semver.Major + "." + $semver.Minor + "." + $semver.Patch
-
- Write-Host "Update IIS Express port in csproj"
- $updater = New-Object "Umbraco.Build.ExpressPortUpdater"
- $csproj = "$($this.SolutionRoot)\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj"
- $updater.Update($csproj, $release)
- })
-
- $ubuild.DefineMethod("SandboxNode",
- {
- $global:node_path = $env:path
- $nodePath = $this.BuildEnv.NodePath
- $gitExe = (Get-Command git).Source
- if (-not $gitExe) { $gitExe = (Get-Command git).Path }
- $gitPath = [System.IO.Path]::GetDirectoryName($gitExe)
- $env:path = "$nodePath;$gitPath"
-
- $global:node_nodepath = $this.ClearEnvVar("NODEPATH")
- $global:node_npmcache = $this.ClearEnvVar("NPM_CONFIG_CACHE")
- $global:node_npmprefix = $this.ClearEnvVar("NPM_CONFIG_PREFIX")
-
- # https://github.com/gruntjs/grunt-contrib-connect/issues/235
- $this.SetEnvVar("NODE_NO_HTTP2", "1")
- })
-
- $ubuild.DefineMethod("RestoreNode",
- {
- $env:path = $node_path
-
- $this.SetEnvVar("NODEPATH", $node_nodepath)
- $this.SetEnvVar("NPM_CONFIG_CACHE", $node_npmcache)
- $this.SetEnvVar("NPM_CONFIG_PREFIX", $node_npmprefix)
-
- $ignore = $this.ClearEnvVar("NODE_NO_HTTP2")
- })
-
- $ubuild.DefineMethod("CompileBelle",
- {
- $src = "$($this.SolutionRoot)\src"
- $log = "$($this.BuildTemp)\belle.log"
-
- Write-Host "Compile Belle"
- Write-Host "Logging to $log"
-
- # get a temp clean node env (will restore)
- $this.SandboxNode()
-
- # stupid PS is going to gather all "warnings" in $error
- # so we have to take care of it else they'll bubble and kill the build
- if ($error.Count -gt 0) { return }
-
- try {
- Push-Location "$($this.SolutionRoot)\src\Umbraco.Web.UI.Client"
- Write-Output "" > $log
-
- Write-Output "### node version is:" > $log
- node -v >> $log 2>&1
- if (-not $?) { throw "Failed to report node version." }
-
- Write-Output "### npm version is:" >> $log 2>&1
- npm -v >> $log 2>&1
- if (-not $?) { throw "Failed to report npm version." }
-
- Write-Output "### clean npm cache" >> $log 2>&1
- npm cache clean --force >> $log 2>&1
- $error.Clear() # that one can fail 'cos security bug - ignore
-
- Write-Output "### npm install" >> $log 2>&1
- npm install >> $log 2>&1
- Write-Output ">> $? $($error.Count)" >> $log 2>&1
- # Don't really care about the messages from npm install making us think there are errors
- $error.Clear()
-
- Write-Output "### gulp build for version $($this.Version.Release)" >> $log 2>&1
- npx gulp build --buildversion=$this.Version.Release >> $log 2>&1
- if (-not $?) { throw "Failed to build" } # that one is expected to work
- } finally {
- Pop-Location
-
- # FIXME: should we filter the log to find errors?
- #get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
-
- # restore
- $this.RestoreNode()
- }
-
- # setting node_modules folder to hidden
- # used to prevent VS13 from crashing on it while loading the websites project
- # also makes sure aspnet compiler does not try to handle rogue files and chokes
- # in VSO with Microsoft.VisualC.CppCodeProvider -related errors
- # use get-item -force 'cos it might be hidden already
- Write-Host "Set hidden attribute on node_modules"
- $dir = Get-Item -force "$src\Umbraco.Web.UI.Client\node_modules"
- $dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden)
- })
-
- $ubuild.DefineMethod("CompileUmbraco",
- {
- $buildConfiguration = "Release"
-
- $src = "$($this.SolutionRoot)\src"
- $log = "$($this.BuildTemp)\msbuild.umbraco.log"
-
- if ($this.BuildEnv.VisualStudio -eq $null)
- {
- throw "Build environment does not provide VisualStudio."
- }
-
- Write-Host "Compile Umbraco"
- Write-Host "Logging to $log"
-
- # beware of the weird double \\ at the end of paths
- # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
- &$this.BuildEnv.VisualStudio.MsBuild "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
- /p:WarningLevel=0 `
- /p:Configuration=$buildConfiguration `
- /p:Platform=AnyCPU `
- /p:UseWPP_CopyWebApplication=True `
- /p:PipelineDependsOnBuild=False `
- /p:OutDir="$($this.BuildTemp)\bin\\" `
- /p:WebProjectOutputDir="$($this.BuildTemp)\WebApp\\" `
- /p:Verbosity=minimal `
- /t:Clean`;Rebuild `
- /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" `
- /p:UmbracoBuild=True `
- > $log
-
- if (-not $?) { throw "Failed to compile Umbraco.Web.UI." }
-
- # /p:UmbracoBuild tells the csproj that we are building from PS, not VS
- })
-
- $ubuild.DefineMethod("PrepareTests",
- {
- Write-Host "Prepare Tests"
-
- # FIXME: - idea is to avoid rebuilding everything for tests
- # but because of our weird assembly versioning (with .* stuff)
- # everything gets rebuilt all the time...
- #Copy-Files "$tmp\bin" "." "$tmp\tests"
-
- # data
- Write-Host "Copy data files"
- if (-not (Test-Path -Path "$($this.BuildTemp)\tests\Packaging" ))
- {
- Write-Host "Create packaging directory"
- mkdir "$($this.BuildTemp)\tests\Packaging" > $null
- }
- $this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Tests\Packaging\Packages", "*", "$($this.BuildTemp)\tests\Packaging\Packages")
-
- # required for package install tests
- if (-not (Test-Path -Path "$($this.BuildTemp)\tests\bin" ))
- {
- Write-Host "Create bin directory"
- mkdir "$($this.BuildTemp)\tests\bin" > $null
- }
- })
-
- $ubuild.DefineMethod("CompileTests",
- {
- $buildConfiguration = "Release"
- $log = "$($this.BuildTemp)\msbuild.tests.log"
-
- if ($this.BuildEnv.VisualStudio -eq $null)
- {
- throw "Build environment does not provide VisualStudio."
- }
-
- Write-Host "Compile Tests"
- Write-Host "Logging to $log"
-
- # beware of the weird double \\ at the end of paths
- # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
- &$this.BuildEnv.VisualStudio.MsBuild "$($this.SolutionRoot)\src\Umbraco.Tests\Umbraco.Tests.csproj" `
- /p:WarningLevel=0 `
- /p:Configuration=$buildConfiguration `
- /p:Platform=AnyCPU `
- /p:UseWPP_CopyWebApplication=True `
- /p:PipelineDependsOnBuild=False `
- /p:OutDir="$($this.BuildTemp)\tests\\" `
- /p:Verbosity=minimal `
- /t:Build `
- /tv:"$($this.BuildEnv.VisualStudio.ToolsVersion)" `
- /p:UmbracoBuild=True `
- > $log
-
- if (-not $?) { throw "Failed to compile tests." }
-
- # /p:UmbracoBuild tells the csproj that we are building from PS
- })
-
- $ubuild.DefineMethod("PreparePackages",
- {
- Write-Host "Prepare Packages"
-
- $src = "$($this.SolutionRoot)\src"
- $tmp = "$($this.BuildTemp)"
- $out = "$($this.BuildOutput)"
-
- $buildConfiguration = "Release"
-
- # restore web.config
- $this.TempRestoreFile("$src\Umbraco.Web.UI\web.config")
-
- # cleanup build
- Write-Host "Clean build"
- $this.RemoveFile("$tmp\bin\*.dll.config")
- $this.RemoveFile("$tmp\WebApp\bin\*.dll.config")
-
- # cleanup presentation
- Write-Host "Cleanup presentation"
- $this.RemoveDirectory("$tmp\WebApp\umbraco.presentation")
-
- # create directories
- Write-Host "Create directories"
- mkdir "$tmp\Configs" > $null
- mkdir "$tmp\Configs\Lang" > $null
- mkdir "$tmp\WebApp\App_Data" > $null
- #mkdir "$tmp\WebApp\Media" > $null
- #mkdir "$tmp\WebApp\Views" > $null
-
- # copy various files
- Write-Host "Copy xml documentation"
- Copy-Item -force "$tmp\bin\*.xml" "$tmp\WebApp\bin"
-
- Write-Host "Copy transformed configs and langs"
- # note: exclude imageprocessor/*.config as imageprocessor pkg installs them
- $this.CopyFiles("$tmp\WebApp\config", "*.config", "$tmp\Configs", `
- { -not $_.RelativeName.StartsWith("imageprocessor") })
- $this.CopyFiles("$tmp\WebApp\config", "*.js", "$tmp\Configs")
- $this.CopyFiles("$tmp\WebApp\config\lang", "*.xml", "$tmp\Configs\Lang")
- $this.CopyFile("$tmp\WebApp\web.config", "$tmp\Configs\web.config.transform")
-
- Write-Host "Copy transformed web.config"
- $this.CopyFile("$src\Umbraco.Web.UI\web.$buildConfiguration.Config.transformed", "$tmp\WebApp\web.config")
-
- # offset the modified timestamps on all umbraco dlls, as WebResources
- # break if date is in the future, which, due to timezone offsets can happen.
- Write-Host "Offset dlls timestamps"
- Get-ChildItem -r "$tmp\*.dll" | ForEach-Object {
- $_.CreationTime = $_.CreationTime.AddHours(-11)
- $_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
- }
-
- # copy libs
- Write-Host "Copy SqlCE libraries"
- $nugetPackages = $env:NUGET_PACKAGES
- if (-not $nugetPackages)
- {
- $nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages")
- }
- $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\bin\x86")
- $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\bin\amd64")
- $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\WebApp\bin\x86")
- $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\WebApp\bin\amd64")
-
- # copy Belle
- Write-Host "Copy Belle"
- $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\assets", "*", "$tmp\WebApp\umbraco\assets")
- $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\js", "*", "$tmp\WebApp\umbraco\js")
- $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\lib", "*", "$tmp\WebApp\umbraco\lib")
- $this.CopyFiles("$src\Umbraco.Web.UI\umbraco\views", "*", "$tmp\WebApp\umbraco\views")
- })
-
- $ubuild.DefineMethod("PackageZip",
- {
- Write-Host "Create Zip packages"
-
- $src = "$($this.SolutionRoot)\src"
- $tmp = $this.BuildTemp
- $out = $this.BuildOutput
-
- Write-Host "Zip all binaries"
- &$this.BuildEnv.Zip a -r "$out\UmbracoCms.AllBinaries.$($this.Version.Semver).zip" `
- "$tmp\bin\*" `
- "-x!dotless.Core.*" `
- > $null
- if (-not $?) { throw "Failed to zip UmbracoCms.AllBinaries." }
-
- Write-Host "Zip cms"
- &$this.BuildEnv.Zip a -r "$out\UmbracoCms.$($this.Version.Semver).zip" `
- "$tmp\WebApp\*" `
- "-x!dotless.Core.*" "-x!Content_Types.xml" "-x!*.pdb" `
- > $null
- if (-not $?) { throw "Failed to zip UmbracoCms." }
- })
-
- $ubuild.DefineMethod("PrepareBuild",
- {
- $this.TempStoreFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
- Write-Host "Create clean web.config"
- $this.CopyFile("$($this.SolutionRoot)\src\Umbraco.Web.UI\web.Template.config", "$($this.SolutionRoot)\src\Umbraco.Web.UI\web.config")
-
- Write-host "Set environment"
- $env:UMBRACO_VERSION=$this.Version.Semver.ToString()
- $env:UMBRACO_RELEASE=$this.Version.Release
- $env:UMBRACO_COMMENT=$this.Version.Comment
- $env:UMBRACO_BUILD=$this.Version.Build
-
- if ($args -and $args[0] -eq "vso")
- {
- Write-host "Set VSO environment"
- # set environment variable for VSO
- # https://github.com/Microsoft/vsts-tasks/issues/375
- # https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md
- Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)")
-
- Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp")
- }
- })
-
- $ubuild.DefineMethod("PrepareNuGet",
- {
- Write-Host "Prepare NuGet"
-
- # add Web.config transform files to the NuGet package
- Write-Host "Add web.config transforms to NuGet package"
- mv "$($this.BuildTemp)\WebApp\Views\Web.config" "$($this.BuildTemp)\WebApp\Views\Web.config.transform"
-
- })
-
- $nugetsourceUmbraco = "https://api.nuget.org/v3/index.json"
-
- $ubuild.DefineMethod("RestoreNuGet",
- {
- Write-Host "Restore NuGet"
- Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log"
- $params = "-Source", $nugetsourceUmbraco
- &$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\src\Umbraco.sln" > "$($this.BuildTemp)\nuget.restore.log" @params
- if (-not $?) { throw "Failed to restore NuGet packages." }
- })
-
- $ubuild.DefineMethod("PackageNuGet",
- {
- $nuspecs = "$($this.SolutionRoot)\build\NuSpecs"
-
- Write-Host "Create NuGet packages"
-
- &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Core.nuspec" `
- -Properties BuildTmp="$($this.BuildTemp)" `
- -Version "$($this.Version.Semver.ToString())" `
- -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmscore.log"
- if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Core." }
-
- &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.Web.nuspec" `
- -Properties BuildTmp="$($this.BuildTemp)" `
- -Version "$($this.Version.Semver.ToString())" `
- -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmsweb.log"
- if (-not $?) { throw "Failed to pack NuGet UmbracoCms.Web." }
-
- &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.nuspec" `
- -Properties BuildTmp="$($this.BuildTemp)" `
- -Version "$($this.Version.Semver.ToString())" `
- -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cms.log"
- if (-not $?) { throw "Failed to pack NuGet UmbracoCms." }
-
- # run hook
- if ($this.HasMethod("PostPackageNuGet"))
- {
- Write-Host "Run PostPackageNuGet hook"
- $this.PostPackageNuGet();
- if (-not $?) { throw "Failed to run hook." }
- }
- })
-
- $ubuild.DefineMethod("VerifyNuGet",
- {
- $this.VerifyNuGetConsistency(
- ("UmbracoCms", "UmbracoCms.Core", "UmbracoCms.Web"),
- ("Umbraco.Core", "Umbraco.Web", "Umbraco.Web.UI", "Umbraco.Examine"))
- if ($this.OnError()) { return }
- })
-
- $ubuild.DefineMethod("PrepareAzureGallery",
- {
- Write-Host "Prepare Azure Gallery"
- $this.CopyFile("$($this.SolutionRoot)\build\Azure\azuregalleryrelease.ps1", $this.BuildOutput)
- })
-
- $ubuild.DefineMethod("PrepareCSharpDocs",
- {
- Write-Host "Prepare C# Documentation"
-
- $src = "$($this.SolutionRoot)\src"
- $tmp = $this.BuildTemp
- $out = $this.BuildOutput
- $DocFxJson = Join-Path -Path $src "\ApiDocs\docfx.json"
- $DocFxSiteOutput = Join-Path -Path $tmp "\_site\*.*"
-
-
- #restore nuget packages
- $this.RestoreNuGet()
- # run DocFx
- $DocFx = $this.BuildEnv.DocFx
-
- & $DocFx metadata $DocFxJson
- & $DocFx build $DocFxJson
-
- # zip it
- & $this.BuildEnv.Zip a -tzip -r "$out\csharp-docs.zip" $DocFxSiteOutput
- })
-
- $ubuild.DefineMethod("PrepareAngularDocs",
- {
- Write-Host "Prepare Angular Documentation"
-
- $src = "$($this.SolutionRoot)\src"
- $out = $this.BuildOutput
-
- "Moving to Umbraco.Web.UI.Docs folder"
- cd ..\src\Umbraco.Web.UI.Docs
-
- "Generating the docs and waiting before executing the next commands"
- & npm install
- & npx gulp docs
-
- # change baseUrl
- $BaseUrl = "https://our.umbraco.com/apidocs/v8/ui/"
- $IndexPath = "./api/index.html"
- (Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath
-
- # zip it
- & $this.BuildEnv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Docs\api\*.*"
- })
-
- $ubuild.DefineMethod("Build",
- {
- $error.Clear()
-
- $this.PrepareBuild()
- if ($this.OnError()) { return }
- $this.RestoreNuGet()
- if ($this.OnError()) { return }
- $this.CompileBelle()
- if ($this.OnError()) { return }
- $this.CompileUmbraco()
- if ($this.OnError()) { return }
- $this.PrepareTests()
- if ($this.OnError()) { return }
- $this.CompileTests()
- if ($this.OnError()) { return }
- # not running tests
- $this.PreparePackages()
- if ($this.OnError()) { return }
- $this.PackageZip()
- if ($this.OnError()) { return }
- $this.VerifyNuGet()
- if ($this.OnError()) { return }
- $this.PrepareNuGet()
- if ($this.OnError()) { return }
- $this.PackageNuGet()
- if ($this.OnError()) { return }
- $this.PrepareAzureGallery()
- if ($this.OnError()) { return }
- $this.PostPackageHook()
- if ($this.OnError()) { return }
-
- Write-Host "Done"
- })
-
- $ubuild.DefineMethod("PostPackageHook",
- {
- # run hook
- if ($this.HasMethod("PostPackage"))
- {
- Write-Host "Run PostPackage hook"
- $this.PostPackage();
- if (-not $?) { throw "Failed to run hook." }
- }
- })
-
- # ################################################################
- # RUN
- # ################################################################
-
- # configure
- $ubuild.ReleaseBranches = @( "master" )
-
- # run
- if (-not $get)
- {
-cd
- if ($command.Length -eq 0)
- {
- $command = @( "Build" )
- }
- $ubuild.RunMethod($command);
- if ($ubuild.OnError()) { return }
- }
- if ($get) { return $ubuild }
+param(
+ # get, don't execute
+ [Parameter(Mandatory=$false)]
+ [Alias("g")]
+ [switch] $get = $false,
+
+ # execute a command
+ [Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)]
+ [String[]]
+ $command
+)
+
+
+
+# ################################################################
+# VARIABLES
+# ################################################################
+
+$rootPath = Join-Path $PSScriptRoot "/.."
+$packagesPath = Join-Path $rootPath "/build/packages"
+$zeroCore = "zero.Core"
+$zeroWeb = "zero.Web"
+$zeroWebUI = "zero.Web.UI"
+$zeroCommerce = "zero.Commerce"
+
+
+# ################################################################
+# FUNCTIONS
+# ################################################################
+
+function Set-Project([String] $project)
+{
+ cd ..
+ cd $project
+}
+
+function Go-Root()
+{
+ cd ..
+ cd "build"
+}
+
+function New-Line()
+{
+ Write-Host ""
+}
+
+
+
+# ################################################################
+# WARMUP
+# ################################################################
+
+# output welcome message
+Write-Host "zero v0.1.0" -ForegroundColor DarkCyan
+New-Line
+
+# cleanup directory
+if (Test-Path -Path $packagesPath -PathType Container)
+{
+ Write-Host "Cleanup packages directory..." -NoNewline
+ Remove-Item -LiteralPath $packagesPath -Force -Recurse
+ New-Item -Path $packagesPath -ItemType Directory
+ Write-Host "Done" -ForegroundColor Cyan
+}
+
+
+
+# ################################################################
+# BUILD + PACK
+# ################################################################
+
+# pack zero core
+Write-Host "zero.Core: building and packing..."
+New-Line
+Set-Project $zeroCore
+dotnet pack -o $packagesPath
+Go-Root
+Write-Host "Done" -ForegroundColor Cyan
+New-Line
+
+# pack zero web
+Write-Host "zero.Web: building and packing..."
+New-Line
+Set-Project $zeroWeb
+dotnet pack -o $packagesPath
+Go-Root
+Write-Host "Done" -ForegroundColor Cyan
+New-Line
+
+# pack zero web
+Write-Host "zero.XTest: building and packing..."
+New-Line
+Set-Project "zero.XTest"
+dotnet pack -o $packagesPath
+Go-Root
+Write-Host "Done" -ForegroundColor Cyan
+New-Line
+
+# pack zero commerce
+Write-Host "zero.Commerce: building and packing..."
+New-Line
+Set-Project $zeroCommerce
+dotnet pack -o $packagesPath
+Go-Root
+Write-Host "Done" -ForegroundColor Cyan
+New-Line
diff --git a/zero.Core/zero.Core.csproj b/zero.Core/zero.Core.csproj
index 41586f8a..ccbb6829 100644
--- a/zero.Core/zero.Core.csproj
+++ b/zero.Core/zero.Core.csproj
@@ -5,6 +5,12 @@
netstandard2.0
+
+ zero.Core
+ 0.1.0
+ // TODO
+
+
diff --git a/zero.Web/zero.Web.csproj b/zero.Web/zero.Web.csproj
index 8c1e0adf..8ad552dd 100644
--- a/zero.Web/zero.Web.csproj
+++ b/zero.Web/zero.Web.csproj
@@ -6,6 +6,12 @@
true
+
+ zero.Web
+ 0.1.0
+ // TODO 2
+
+
@@ -19,4 +25,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/zero.XTest/Class1.cs b/zero.XTest/Class1.cs
new file mode 100644
index 00000000..d44778b0
--- /dev/null
+++ b/zero.XTest/Class1.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace zero.XTest
+{
+ public class Class1
+ {
+ }
+}
diff --git a/zero.XTest/Resources/Countries/countries.de-de.json b/zero.XTest/Resources/Countries/countries.de-de.json
new file mode 100644
index 00000000..78384674
--- /dev/null
+++ b/zero.XTest/Resources/Countries/countries.de-de.json
@@ -0,0 +1,257 @@
+{
+ "AF": "Afghanistan",
+ "EG": "\u00c4gypten",
+ "AX": "\u00c5landinseln",
+ "AL": "Albanien",
+ "DZ": "Algerien",
+ "AS": "Amerikanisch-Samoa",
+ "VI": "Amerikanische Jungferninseln",
+ "UM": "Amerikanische \u00dcberseeinseln",
+ "AD": "Andorra",
+ "AO": "Angola",
+ "AI": "Anguilla",
+ "AQ": "Antarktis",
+ "AG": "Antigua und Barbuda",
+ "GQ": "\u00c4quatorialguinea",
+ "AR": "Argentinien",
+ "AM": "Armenien",
+ "AW": "Aruba",
+ "AC": "Ascension",
+ "AZ": "Aserbaidschan",
+ "ET": "\u00c4thiopien",
+ "AU": "Australien",
+ "BS": "Bahamas",
+ "BH": "Bahrain",
+ "BD": "Bangladesch",
+ "BB": "Barbados",
+ "BY": "Belarus",
+ "BE": "Belgien",
+ "BZ": "Belize",
+ "BJ": "Benin",
+ "BM": "Bermuda",
+ "BT": "Bhutan",
+ "BO": "Bolivien",
+ "BQ": "Bonaire, Sint Eustatius und Saba",
+ "BA": "Bosnien und Herzegowina",
+ "BW": "Botsuana",
+ "BR": "Brasilien",
+ "VG": "Britische Jungferninseln",
+ "IO": "Britisches Territorium im Indischen Ozean",
+ "BN": "Brunei Darussalam",
+ "BG": "Bulgarien",
+ "BF": "Burkina Faso",
+ "BI": "Burundi",
+ "CV": "Cabo Verde",
+ "EA": "Ceuta und Melilla",
+ "CL": "Chile",
+ "CN": "China",
+ "CK": "Cookinseln",
+ "CR": "Costa Rica",
+ "CI": "C\u00f4te d\u2019Ivoire",
+ "CW": "Cura\u00e7ao",
+ "DK": "D\u00e4nemark",
+ "DE": "Deutschland",
+ "DG": "Diego Garcia",
+ "DM": "Dominica",
+ "DO": "Dominikanische Republik",
+ "DJ": "Dschibuti",
+ "EC": "Ecuador",
+ "SV": "El Salvador",
+ "ER": "Eritrea",
+ "EE": "Estland",
+ "FK": "Falklandinseln",
+ "FO": "F\u00e4r\u00f6er",
+ "FJ": "Fidschi",
+ "FI": "Finnland",
+ "FR": "Frankreich",
+ "GF": "Franz\u00f6sisch-Guayana",
+ "PF": "Franz\u00f6sisch-Polynesien",
+ "TF": "Franz\u00f6sische S\u00fcd- und Antarktisgebiete",
+ "GA": "Gabun",
+ "GM": "Gambia",
+ "GE": "Georgien",
+ "GH": "Ghana",
+ "GI": "Gibraltar",
+ "GD": "Grenada",
+ "GR": "Griechenland",
+ "GL": "Gr\u00f6nland",
+ "GP": "Guadeloupe",
+ "GU": "Guam",
+ "GT": "Guatemala",
+ "GG": "Guernsey",
+ "GN": "Guinea",
+ "GW": "Guinea-Bissau",
+ "GY": "Guyana",
+ "HT": "Haiti",
+ "HN": "Honduras",
+ "IN": "Indien",
+ "ID": "Indonesien",
+ "IQ": "Irak",
+ "IR": "Iran",
+ "IE": "Irland",
+ "IS": "Island",
+ "IM": "Isle of Man",
+ "IL": "Israel",
+ "IT": "Italien",
+ "JM": "Jamaika",
+ "JP": "Japan",
+ "YE": "Jemen",
+ "JE": "Jersey",
+ "JO": "Jordanien",
+ "KY": "Kaimaninseln",
+ "KH": "Kambodscha",
+ "CM": "Kamerun",
+ "CA": "Kanada",
+ "IC": "Kanarische Inseln",
+ "KZ": "Kasachstan",
+ "QA": "Katar",
+ "KE": "Kenia",
+ "KG": "Kirgisistan",
+ "KI": "Kiribati",
+ "CC": "Kokosinseln",
+ "CO": "Kolumbien",
+ "KM": "Komoren",
+ "CG": "Kongo-Brazzaville",
+ "CD": "Kongo-Kinshasa",
+ "XK": "Kosovo",
+ "HR": "Kroatien",
+ "CU": "Kuba",
+ "KW": "Kuwait",
+ "LA": "Laos",
+ "LS": "Lesotho",
+ "LV": "Lettland",
+ "LB": "Libanon",
+ "LR": "Liberia",
+ "LY": "Libyen",
+ "LI": "Liechtenstein",
+ "LT": "Litauen",
+ "LU": "Luxemburg",
+ "MG": "Madagaskar",
+ "MW": "Malawi",
+ "MY": "Malaysia",
+ "MV": "Malediven",
+ "ML": "Mali",
+ "MT": "Malta",
+ "MA": "Marokko",
+ "MH": "Marshallinseln",
+ "MQ": "Martinique",
+ "MR": "Mauretanien",
+ "MU": "Mauritius",
+ "YT": "Mayotte",
+ "MX": "Mexiko",
+ "FM": "Mikronesien",
+ "MC": "Monaco",
+ "MN": "Mongolei",
+ "ME": "Montenegro",
+ "MS": "Montserrat",
+ "MZ": "Mosambik",
+ "MM": "Myanmar",
+ "NA": "Namibia",
+ "NR": "Nauru",
+ "NP": "Nepal",
+ "NC": "Neukaledonien",
+ "NZ": "Neuseeland",
+ "NI": "Nicaragua",
+ "NL": "Niederlande",
+ "NE": "Niger",
+ "NG": "Nigeria",
+ "NU": "Niue",
+ "KP": "Nordkorea",
+ "MP": "N\u00f6rdliche Marianen",
+ "MK": "Nordmazedonien",
+ "NF": "Norfolkinsel",
+ "NO": "Norwegen",
+ "OM": "Oman",
+ "AT": "\u00d6sterreich",
+ "PK": "Pakistan",
+ "PS": "Pal\u00e4stinensische Autonomiegebiete",
+ "PW": "Palau",
+ "PA": "Panama",
+ "PG": "Papua-Neuguinea",
+ "PY": "Paraguay",
+ "PE": "Peru",
+ "PH": "Philippinen",
+ "PN": "Pitcairninseln",
+ "PL": "Polen",
+ "PT": "Portugal",
+ "XA": "Pseudo-Accents",
+ "XB": "Pseudo-Bidi",
+ "PR": "Puerto Rico",
+ "MD": "Republik Moldau",
+ "RE": "R\u00e9union",
+ "RW": "Ruanda",
+ "RO": "Rum\u00e4nien",
+ "RU": "Russland",
+ "SB": "Salomonen",
+ "ZM": "Sambia",
+ "WS": "Samoa",
+ "SM": "San Marino",
+ "ST": "S\u00e3o Tom\u00e9 und Pr\u00edncipe",
+ "SA": "Saudi-Arabien",
+ "SE": "Schweden",
+ "CH": "Schweiz",
+ "SN": "Senegal",
+ "RS": "Serbien",
+ "SC": "Seychellen",
+ "SL": "Sierra Leone",
+ "ZW": "Simbabwe",
+ "SG": "Singapur",
+ "SX": "Sint Maarten",
+ "SK": "Slowakei",
+ "SI": "Slowenien",
+ "SO": "Somalia",
+ "HK": "Sonderverwaltungsregion Hongkong",
+ "MO": "Sonderverwaltungsregion Macau",
+ "ES": "Spanien",
+ "SJ": "Spitzbergen und Jan Mayen",
+ "LK": "Sri Lanka",
+ "BL": "St. Barth\u00e9lemy",
+ "SH": "St. Helena",
+ "KN": "St. Kitts und Nevis",
+ "LC": "St. Lucia",
+ "MF": "St. Martin",
+ "PM": "St. Pierre und Miquelon",
+ "VC": "St. Vincent und die Grenadinen",
+ "ZA": "S\u00fcdafrika",
+ "SD": "Sudan",
+ "GS": "S\u00fcdgeorgien und die S\u00fcdlichen Sandwichinseln",
+ "KR": "S\u00fcdkorea",
+ "SS": "S\u00fcdsudan",
+ "SR": "Suriname",
+ "SZ": "Swasiland",
+ "SY": "Syrien",
+ "TJ": "Tadschikistan",
+ "TW": "Taiwan",
+ "TZ": "Tansania",
+ "TH": "Thailand",
+ "TL": "Timor-Leste",
+ "TG": "Togo",
+ "TK": "Tokelau",
+ "TO": "Tonga",
+ "TT": "Trinidad und Tobago",
+ "TA": "Tristan da Cunha",
+ "TD": "Tschad",
+ "CZ": "Tschechien",
+ "TN": "Tunesien",
+ "TR": "T\u00fcrkei",
+ "TM": "Turkmenistan",
+ "TC": "Turks- und Caicosinseln",
+ "TV": "Tuvalu",
+ "UG": "Uganda",
+ "UA": "Ukraine",
+ "HU": "Ungarn",
+ "UY": "Uruguay",
+ "UZ": "Usbekistan",
+ "VU": "Vanuatu",
+ "VA": "Vatikanstadt",
+ "VE": "Venezuela",
+ "AE": "Vereinigte Arabische Emirate",
+ "US": "Vereinigte Staaten",
+ "GB": "Vereinigtes K\u00f6nigreich",
+ "VN": "Vietnam",
+ "WF": "Wallis und Futuna",
+ "CX": "Weihnachtsinsel",
+ "EH": "Westsahara",
+ "CF": "Zentralafrikanische Republik",
+ "CY": "Zypern"
+}
\ No newline at end of file
diff --git a/zero.XTest/Resources/Countries/countries.en-us.json b/zero.XTest/Resources/Countries/countries.en-us.json
new file mode 100644
index 00000000..81dd1733
--- /dev/null
+++ b/zero.XTest/Resources/Countries/countries.en-us.json
@@ -0,0 +1,257 @@
+{
+ "AF": "Afghanistan",
+ "AX": "\u00c5land Islands",
+ "AL": "Albania",
+ "DZ": "Algeria",
+ "AS": "American Samoa",
+ "AD": "Andorra",
+ "AO": "Angola",
+ "AI": "Anguilla",
+ "AQ": "Antarctica",
+ "AG": "Antigua & Barbuda",
+ "AR": "Argentina",
+ "AM": "Armenia",
+ "AW": "Aruba",
+ "AC": "Ascension Island",
+ "AU": "Australia",
+ "AT": "Austria",
+ "AZ": "Azerbaijan",
+ "BS": "Bahamas",
+ "BH": "Bahrain",
+ "BD": "Bangladesh",
+ "BB": "Barbados",
+ "BY": "Belarus",
+ "BE": "Belgium",
+ "BZ": "Belize",
+ "BJ": "Benin",
+ "BM": "Bermuda",
+ "BT": "Bhutan",
+ "BO": "Bolivia",
+ "BA": "Bosnia & Herzegovina",
+ "BW": "Botswana",
+ "BR": "Brazil",
+ "IO": "British Indian Ocean Territory",
+ "VG": "British Virgin Islands",
+ "BN": "Brunei",
+ "BG": "Bulgaria",
+ "BF": "Burkina Faso",
+ "BI": "Burundi",
+ "KH": "Cambodia",
+ "CM": "Cameroon",
+ "CA": "Canada",
+ "IC": "Canary Islands",
+ "CV": "Cape Verde",
+ "BQ": "Caribbean Netherlands",
+ "KY": "Cayman Islands",
+ "CF": "Central African Republic",
+ "EA": "Ceuta & Melilla",
+ "TD": "Chad",
+ "CL": "Chile",
+ "CN": "China",
+ "CX": "Christmas Island",
+ "CC": "Cocos (Keeling) Islands",
+ "CO": "Colombia",
+ "KM": "Comoros",
+ "CG": "Congo - Brazzaville",
+ "CD": "Congo - Kinshasa",
+ "CK": "Cook Islands",
+ "CR": "Costa Rica",
+ "CI": "C\u00f4te d\u2019Ivoire",
+ "HR": "Croatia",
+ "CU": "Cuba",
+ "CW": "Cura\u00e7ao",
+ "CY": "Cyprus",
+ "CZ": "Czechia",
+ "DK": "Denmark",
+ "DG": "Diego Garcia",
+ "DJ": "Djibouti",
+ "DM": "Dominica",
+ "DO": "Dominican Republic",
+ "EC": "Ecuador",
+ "EG": "Egypt",
+ "SV": "El Salvador",
+ "GQ": "Equatorial Guinea",
+ "ER": "Eritrea",
+ "EE": "Estonia",
+ "SZ": "Eswatini",
+ "ET": "Ethiopia",
+ "FK": "Falkland Islands",
+ "FO": "Faroe Islands",
+ "FJ": "Fiji",
+ "FI": "Finland",
+ "FR": "France",
+ "GF": "French Guiana",
+ "PF": "French Polynesia",
+ "TF": "French Southern Territories",
+ "GA": "Gabon",
+ "GM": "Gambia",
+ "GE": "Georgia",
+ "DE": "Germany",
+ "GH": "Ghana",
+ "GI": "Gibraltar",
+ "GR": "Greece",
+ "GL": "Greenland",
+ "GD": "Grenada",
+ "GP": "Guadeloupe",
+ "GU": "Guam",
+ "GT": "Guatemala",
+ "GG": "Guernsey",
+ "GN": "Guinea",
+ "GW": "Guinea-Bissau",
+ "GY": "Guyana",
+ "HT": "Haiti",
+ "HN": "Honduras",
+ "HK": "Hong Kong SAR China",
+ "HU": "Hungary",
+ "IS": "Iceland",
+ "IN": "India",
+ "ID": "Indonesia",
+ "IR": "Iran",
+ "IQ": "Iraq",
+ "IE": "Ireland",
+ "IM": "Isle of Man",
+ "IL": "Israel",
+ "IT": "Italy",
+ "JM": "Jamaica",
+ "JP": "Japan",
+ "JE": "Jersey",
+ "JO": "Jordan",
+ "KZ": "Kazakhstan",
+ "KE": "Kenya",
+ "KI": "Kiribati",
+ "XK": "Kosovo",
+ "KW": "Kuwait",
+ "KG": "Kyrgyzstan",
+ "LA": "Laos",
+ "LV": "Latvia",
+ "LB": "Lebanon",
+ "LS": "Lesotho",
+ "LR": "Liberia",
+ "LY": "Libya",
+ "LI": "Liechtenstein",
+ "LT": "Lithuania",
+ "LU": "Luxembourg",
+ "MO": "Macao SAR China",
+ "MG": "Madagascar",
+ "MW": "Malawi",
+ "MY": "Malaysia",
+ "MV": "Maldives",
+ "ML": "Mali",
+ "MT": "Malta",
+ "MH": "Marshall Islands",
+ "MQ": "Martinique",
+ "MR": "Mauritania",
+ "MU": "Mauritius",
+ "YT": "Mayotte",
+ "MX": "Mexico",
+ "FM": "Micronesia",
+ "MD": "Moldova",
+ "MC": "Monaco",
+ "MN": "Mongolia",
+ "ME": "Montenegro",
+ "MS": "Montserrat",
+ "MA": "Morocco",
+ "MZ": "Mozambique",
+ "MM": "Myanmar (Burma)",
+ "NA": "Namibia",
+ "NR": "Nauru",
+ "NP": "Nepal",
+ "NL": "Netherlands",
+ "NC": "New Caledonia",
+ "NZ": "New Zealand",
+ "NI": "Nicaragua",
+ "NE": "Niger",
+ "NG": "Nigeria",
+ "NU": "Niue",
+ "NF": "Norfolk Island",
+ "KP": "North Korea",
+ "MK": "North Macedonia",
+ "MP": "Northern Mariana Islands",
+ "NO": "Norway",
+ "OM": "Oman",
+ "PK": "Pakistan",
+ "PW": "Palau",
+ "PS": "Palestinian Territories",
+ "PA": "Panama",
+ "PG": "Papua New Guinea",
+ "PY": "Paraguay",
+ "PE": "Peru",
+ "PH": "Philippines",
+ "PN": "Pitcairn Islands",
+ "PL": "Poland",
+ "PT": "Portugal",
+ "XA": "Pseudo-Accents",
+ "XB": "Pseudo-Bidi",
+ "PR": "Puerto Rico",
+ "QA": "Qatar",
+ "RE": "R\u00e9union",
+ "RO": "Romania",
+ "RU": "Russia",
+ "RW": "Rwanda",
+ "WS": "Samoa",
+ "SM": "San Marino",
+ "ST": "S\u00e3o Tom\u00e9 & Pr\u00edncipe",
+ "SA": "Saudi Arabia",
+ "SN": "Senegal",
+ "RS": "Serbia",
+ "SC": "Seychelles",
+ "SL": "Sierra Leone",
+ "SG": "Singapore",
+ "SX": "Sint Maarten",
+ "SK": "Slovakia",
+ "SI": "Slovenia",
+ "SB": "Solomon Islands",
+ "SO": "Somalia",
+ "ZA": "South Africa",
+ "GS": "South Georgia & South Sandwich Islands",
+ "KR": "South Korea",
+ "SS": "South Sudan",
+ "ES": "Spain",
+ "LK": "Sri Lanka",
+ "BL": "St. Barth\u00e9lemy",
+ "SH": "St. Helena",
+ "KN": "St. Kitts & Nevis",
+ "LC": "St. Lucia",
+ "MF": "St. Martin",
+ "PM": "St. Pierre & Miquelon",
+ "VC": "St. Vincent & Grenadines",
+ "SD": "Sudan",
+ "SR": "Suriname",
+ "SJ": "Svalbard & Jan Mayen",
+ "SE": "Sweden",
+ "CH": "Switzerland",
+ "SY": "Syria",
+ "TW": "Taiwan",
+ "TJ": "Tajikistan",
+ "TZ": "Tanzania",
+ "TH": "Thailand",
+ "TL": "Timor-Leste",
+ "TG": "Togo",
+ "TK": "Tokelau",
+ "TO": "Tonga",
+ "TT": "Trinidad & Tobago",
+ "TA": "Tristan da Cunha",
+ "TN": "Tunisia",
+ "TR": "Turkey",
+ "TM": "Turkmenistan",
+ "TC": "Turks & Caicos Islands",
+ "TV": "Tuvalu",
+ "UM": "U.S. Outlying Islands",
+ "VI": "U.S. Virgin Islands",
+ "UG": "Uganda",
+ "UA": "Ukraine",
+ "AE": "United Arab Emirates",
+ "GB": "United Kingdom",
+ "US": "United States",
+ "UY": "Uruguay",
+ "UZ": "Uzbekistan",
+ "VU": "Vanuatu",
+ "VA": "Vatican City",
+ "VE": "Venezuela",
+ "VN": "Vietnam",
+ "WF": "Wallis & Futuna",
+ "EH": "Western Sahara",
+ "YE": "Yemen",
+ "ZM": "Zambia",
+ "ZW": "Zimbabwe"
+}
\ No newline at end of file
diff --git a/zero.XTest/Resources/Localization/zero.en-us.json b/zero.XTest/Resources/Localization/zero.en-us.json
new file mode 100644
index 00000000..d2323173
--- /dev/null
+++ b/zero.XTest/Resources/Localization/zero.en-us.json
@@ -0,0 +1,446 @@
+{
+ "zero": {
+ "name": "zero"
+ },
+
+ "ui": {
+ "more": "More",
+ "add": "Add",
+ "actions": "Actions",
+ "back": "Go back",
+ "close": "Close",
+ "confirm": "Confirm",
+ "save": "Save",
+ "create": "Create",
+ "createdDate": "Created at",
+ "id": "ID",
+ "active": "Active",
+ "inactive": "Inactive",
+ "delete": "Delete",
+ "default": "Default",
+ "remove": "Remove",
+ "pagination": {
+ "xofy": "Page {x} of {y}",
+ "next": "Next page",
+ "previous": "Previous page"
+ },
+ "search": {
+ "placeholder": "Search ...",
+ "button": "Search"
+ },
+ "name": "Name",
+ "select": "Select",
+ "icon": "Icon",
+ "icon_select": "Select an icon",
+ "tab_general": "General",
+ "tab_content": "Content",
+ "pick": {
+ "title": "Choose one",
+ "title_multiple": "Choose",
+ "title_autocomplete": "Enter a value",
+ "max": "max. {count}"
+ },
+ "date": {
+ "select": "Select date...",
+ "xtoy": "{x} to {y}",
+ "x": "from {x}",
+ "y": "until {y}"
+ },
+ "price": {
+ "free": "Free",
+ "xtoy": "from {x} to {y}",
+ "x": "from {x}",
+ "y": "to {y}"
+ }
+ },
+
+ "gender": {
+ "undisclosed": "Undisclosed",
+ "male": "Male",
+ "female": "Female",
+ "nonbinary": "Non-binary"
+ },
+
+ "rte": {
+ "bold": "Bold",
+ "italic": "Italic",
+ "underline": "Underline",
+ "strikethrough": "Strike-through",
+ "heading1": "Heading 1",
+ "heading2": "Heading 2",
+ "paragraph": "Paragraph",
+ "quote": "Quote",
+ "olist": "Ordered list",
+ "ulist": "Unordered list",
+ "code": "Code",
+ "line": "Horizontal line",
+ "link": "Link",
+ "image": "Image",
+ "video": "Video",
+ "accept": "Accept",
+ "cancel": "Cancel",
+ "raw": "Edit HTML"
+ },
+
+ "errors": {
+ "onsave": {
+ "notallowed": "You are not allowed to edit this resource"
+ },
+ "ondelete": {
+ "idnotfound": "Could not find an entity for the given ID"
+ },
+ "http": {
+ "403": "Unauthorized",
+ "403_text": "You are not allowed to view this resource",
+ "404": "Not found",
+ "404_text": "The requested resource could not be found
({path})",
+ "409": "Conflict",
+ "409_text": "The operation could not be completed as it is not valid anymore. Please reload the page",
+ "4xx": "Client error",
+ "4xx_text": "There was an internal client error (code: {code})",
+ "504": "Timed out",
+ "504_text": "The backoffice did not receive a timely response from the server",
+ "5xx": "Server error",
+ "5xx_text": "There was an internal server error (code: {code})"
+ },
+ "role": {
+ "emptyclaim": "A permission needs both a key and a value",
+ "nosection": "You have to select at least one section to give users access to"
+ },
+ "changepassword": {
+ "emptyfields": "Please fill out all fields",
+ "nouser": "User is invalid",
+ "newpasswordsnotmatching": "The new password does not match the confirmation"
+ },
+ "preview": {
+ "notfound": "Not found",
+ "notfound_text": "Could not find entity with ID \"{id}\""
+ }
+ },
+
+ "unsavedchanges": {
+ "title": "You have unsaved changes",
+ "text": "Are you sure you want to navigate away from this page?",
+ "close": "Discard changes",
+ "confirm": "Stay on page"
+ },
+
+ "deleteoverlay": {
+ "close": "Cancel",
+ "confirm": "Delete",
+ "title": "Delete entity",
+ "text": "Are you sure you want to delete this entity?",
+ "success": "Deleted",
+ "success_text": "You have successfully deleted this entity"
+ },
+
+ "changepasswordoverlay": {
+ "title": "Change password",
+ "confirm": "Change password",
+ "fields": {
+ "currentPassword": "Current password",
+ "newPassword": "New password",
+ "confirmNewPassword": "Confirm new password"
+ }
+ },
+
+ "sections": {
+ "item": {
+ "dashboard": "Dashboard",
+ "spaces": "Spaces",
+ "media": "Media",
+ "pages": "Pages",
+ "settings": "Settings"
+ }
+ },
+
+ "settings": {
+ "groups": {
+ "system": "System",
+ "plugins": "Plugins"
+ },
+ "system": {
+ "updates": {
+ "name": "Updates",
+ "text": "Version {zero_version}",
+ "text_default": "Update current zero version"
+ },
+ "applications": {
+ "name": "Applications",
+ "text": "Edit website applications"
+ },
+ "users": {
+ "name": "Users & Permissions",
+ "text": "Administration of backoffice users"
+ },
+ "languages": {
+ "name": "Languages",
+ "text": "Frontend languages"
+ },
+ "translations": {
+ "name": "Translations",
+ "text": "Frontend texts and translations"
+ },
+ "countries": {
+ "name": "Countries",
+ "text": "Manage list of countries"
+ },
+ "logs": {
+ "name": "Logging",
+ "text": "Debug und view logs"
+ }
+ },
+ "plugins": {
+ "installed": {
+ "name": "Installed plugins",
+ "text": "{plugin_count} installed plugin(s)",
+ "text_default": "Manage and install plugins"
+ },
+ "create": {
+ "name": "Create a plugin",
+ "text": "Create from existing code"
+ }
+ }
+ },
+
+ "user": {
+ "name": "User",
+ "users": "Users",
+ "count_permissions": "{count} permissions",
+ "one_permission": "1 permission",
+ "tab_permissions": "Permissions",
+ "fields": {
+ "name_placeholder": "Enter your real name or a username",
+ "email": "Email",
+ "email_text": "Also used as login username",
+ "email_placeholder": "Enter your email address",
+ "avatarId": "Avatar",
+ "avatarId_text": "Upload a user image",
+ "languageId": "Language",
+ "languageId_text": "Set the backoffice language for this user",
+ "roles": "Roles",
+ "roles_text": "Add default permissions from roles",
+ "sections": "Sections",
+ "sections_text": "Specify access to backoffice sections",
+ "isActive": "Can login",
+ "isDisabled": "Disable",
+ "isLockedOut": "Locked out",
+ "isLockedOut_warning": "The user is locked out until",
+ "isDisabled_warning": "This user is disabled and cannot log into zero anymore. Status can be changed in Actions dropdown"
+ }
+ },
+
+ "role": {
+ "name": "Role",
+ "roles": "Roles",
+ "tab_permissions": "Permissions",
+ "fields": {
+ "description": "Description",
+ "icon": "Icon"
+ }
+ },
+
+ "permission": {
+ "states": {
+ "read": "View",
+ "write": "Edit",
+ "none": "None"
+ },
+ "collections": {
+ "sections": "Access to sections",
+ "sections_description": "Allow access to the following sections",
+ "settings": "Access to settings",
+ "settings_description": "Define read and write access for settings areas",
+ "spaces": "Access to spaces",
+ "spaces_description": "Granular control of spaces"
+ }
+ },
+
+ "login": {
+ "headline": "hello and welcome",
+ "button": "Login",
+ "button_forgot": "Forgot password?",
+ "fields": {
+ "email": "Email",
+ "email_placeholder": "Enter your email or username",
+ "password": "Password",
+ "password_placeholder": "Enter your password"
+ },
+ "errors": {
+ "wrongcredentials": "Email or password is wrong",
+ "lockedout": "The user has been locked out due to many failed password attempts",
+ "disabled": "The user has been deactivated",
+ "notallowed": "The user is not allowed to sign in",
+ "requirestwofactor": "Two-factor authentication is required to login"
+ },
+ "rejectReasons": {
+ "logout": "You have successfully logged out",
+ "inactive": "You have been inactive for too long. Please login again.",
+ "terminated": "Your session has been terminated. Please login again.",
+ "userchanged": "Your user data has changed. Please login again.",
+ "passwordchanged": "Your password was successfully changed. Please login again."
+ }
+ },
+
+ "order": {
+ "fields": {
+ "no": "Number",
+ "username": "Name",
+ "price": "Price",
+ "status": "Status"
+ }
+ },
+
+ "page": {
+ "overview": {
+ "actions": {
+ "continue": "Continue",
+ "continue_text": "You have last edited \"{page}\" on {date}",
+ "new": "New page",
+ "new_text": "Create a new page on root",
+ "history": "History",
+ "history_text": "View page editing history"
+ }
+ },
+ "recyclebin": {
+ "name": "Recycle bin",
+ "description": "View recently deleted entities"
+ },
+ "history": {
+ "name": "History"
+ }
+ },
+
+ "country": {
+ "list": "Countries",
+ "name": "Country",
+ "fields": {
+ "code": "Code",
+ "code_text": "Code in ISO 3166-1 format which is used to display the appropriate flag",
+ "isPreferred": "Show on top"
+ }
+ },
+
+ "language": {
+ "list": "Languages",
+ "name": "Language",
+ "fields": {
+ "name": "Name",
+ "locale": "Locale",
+ "code": "ISO Code",
+ "code_text": "Code in ISO 3166-1 format",
+ "isDefault": "Default",
+ "isDefault_text": "Use as default language",
+ "isOptional": "Optional",
+ "isOptional_text": "Values for an optional language must not be entered, even if the field is required",
+ "inheritedLanguageId": "Fallback",
+ "inheritedLanguageId_text": "To allow multi-lingual content to fall back to another language if not present in the requested language, select it here"
+ }
+ },
+
+ "translation": {
+ "list": "Translations",
+ "name": "Translation",
+ "display": {
+ "text": "Text",
+ "html": "HTML"
+ },
+ "fields": {
+ "key": "Key",
+ "value": "Value",
+ "display": "Display type"
+ }
+ },
+
+ "iconpicker": {
+ "title": "Pick an icon"
+ },
+
+ "mediapicker": {
+ "select_text": "Add media",
+ "select_description": "Upload or select",
+ "upload_text": "Upload",
+ "upload_description": "Upload a new file"
+ },
+
+ "application": {
+ "list": "Applications",
+ "name": "Application",
+ "tab_features": "Features",
+ "tab_domains": "Domains",
+ "fields": {
+ "name": "Name",
+ "name_text": "Short human-readable name",
+ "fullName": "Full name",
+ "fullName_text": "Full company or product name",
+ "imageid": "Image",
+ "imageid_text": "Image of the app (with transparent background), used for all mails, PDFs, ...",
+ "iconid": "Icon",
+ "iconid_text": "Icon of the app. Simplified image for minor application parts",
+ "email": "Email",
+ "email_text": "Generic contact email",
+ "domains": "Domains",
+ "domains_text": "Select domains for this application",
+ "domains_help": "Valid domain names are: \"example.com\", \"www.example.com\", \"example.com:8080\", or \"https://www.example.com\".",
+ "domains_add": "Add domain",
+ "features": "Features",
+ "features_text": "Enable additional features for this application"
+ }
+ },
+
+ "media": {
+ "list": "Media",
+ "name": "Media",
+ "addfolder": "Add a new folder",
+ "fields": {
+ "foldername_placeholder": "Enter a name ...",
+ "caption": "Caption",
+ "dimension": "Dimension",
+ "size": "Size",
+ "date": "Date",
+ "filename": "Filename",
+ "alternativeText": "Alternative text"
+ }
+ },
+
+ "_test": {
+ "fields": {
+ "name": "Name",
+ "position": "Position",
+ "image": "Image",
+ "email": "Email",
+ "videoUri": "Video URL",
+ "isvisible": "Visible",
+ "facebook": "Facebook",
+ "facebook_text": "Link to facebook page",
+ "youtube": "Youtube",
+ "youtube_text": "Link to youtube channel",
+ "twitter": "Twitter",
+ "twitter_text": "Link to twitter profile",
+ "xIconPicker": "Icon",
+ "xTextarea": "Description",
+ "addresses": "Addresses",
+ "addresses_text": "Enter as many addresses as you wish",
+ "xCustom": "Generate",
+ "xRte": "Description as HTML",
+ "xMedia": "Images",
+ "xState": "Select media type",
+ "address": {
+ "city": "City",
+ "street": "Street",
+ "no": "No",
+ "countries": "Country",
+ "name": "Name",
+ "iso": "ISO Code"
+ },
+ "hideInNavigation": "Hide in navigation",
+ "hideInTitle": "Hide in title",
+ "titleOverride": "Override title",
+ "titleOverrideAll": "Override full title",
+ "seoDescription": "SEO Description",
+ "seoImage": "Image",
+ "noFollow": "No follow",
+ "noIndex": "No index"
+ }
+ }
+}
\ No newline at end of file
diff --git a/zero.XTest/zero.XTest.csproj b/zero.XTest/zero.XTest.csproj
new file mode 100644
index 00000000..198ea9f0
--- /dev/null
+++ b/zero.XTest/zero.XTest.csproj
@@ -0,0 +1,56 @@
+
+
+
+ 8.0
+ net5.0
+ true
+
+
+
+ zero.XTest
+ 0.1.0
+ // TODO 2
+
+
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zero.sln b/zero.sln
index 3f085097..f9bc37b6 100644
--- a/zero.sln
+++ b/zero.sln
@@ -41,6 +41,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{1CE271AD
build\build.ps1 = build\build.ps1
EndProjectSection
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "zero.XTest", "zero.XTest\zero.XTest.csproj", "{1699E34B-A9BE-411B-BA5B-E0682B8245B1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -71,6 +73,10 @@ Global
{F6ECD591-4D06-4C36-A41E-29148B9E42D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6ECD591-4D06-4C36-A41E-29148B9E42D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6ECD591-4D06-4C36-A41E-29148B9E42D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1699E34B-A9BE-411B-BA5B-E0682B8245B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1699E34B-A9BE-411B-BA5B-E0682B8245B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1699E34B-A9BE-411B-BA5B-E0682B8245B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1699E34B-A9BE-411B-BA5B-E0682B8245B1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE