diff --git a/InstallAndBuildAllTemplates.ps1 b/InstallAndBuildAllTemplates.ps1 index 625455a1..0ee24e5f 100644 --- a/InstallAndBuildAllTemplates.ps1 +++ b/InstallAndBuildAllTemplates.ps1 @@ -4,6 +4,7 @@ Remove-Item -LiteralPath $tests -Force -Recurse -ErrorAction SilentlyContinue New-Item -Path $tests -ItemType Directory dotnet new install $(Join-Path $PSScriptRoot '/src/mudblazor') --force +dotnet new install $(Join-Path $PSScriptRoot '/src/mudblazor-wasm') --force dotnet new mudblazor --interactivity None --output $(Join-Path $tests 'InteractivityNone') dotnet build $(Join-Path $tests '/InteractivityNone') /warnaserror @@ -55,3 +56,27 @@ dotnet build $(Join-Path $tests 'InteractivityAuto_Auth_LocalDb') /warnaserror dotnet new mudblazor --interactivity Auto --output $(Join-Path $tests 'InteractivityAuto_UseMain') --use-program-main dotnet build $(Join-Path $tests 'InteractivityAuto_UseMain') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone') +dotnet build $(Join-Path $tests 'WasmStandalone') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_Auth_Individual') --auth Individual +dotnet build $(Join-Path $tests 'WasmStandalone_Auth_Individual') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_Auth_B2C') --auth IndividualB2C +dotnet build $(Join-Path $tests 'WasmStandalone_Auth_B2C') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_Auth_SingleOrg') --auth SingleOrg +dotnet build $(Join-Path $tests 'WasmStandalone_Auth_SingleOrg') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_Pwa') --pwa +dotnet build $(Join-Path $tests 'WasmStandalone_Pwa') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_UseMain') --use-program-main +dotnet build $(Join-Path $tests 'WasmStandalone_UseMain') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_Empty') --empty +dotnet build $(Join-Path $tests 'WasmStandalone_Empty') /warnaserror + +dotnet new mudblazorwasm --output $(Join-Path $tests 'WasmStandalone_CallsWebApi') --auth IndividualB2C --called-api-url https://example.com/api --called-api-scopes api.read +dotnet build $(Join-Path $tests 'WasmStandalone_CallsWebApi') /warnaserror diff --git a/README.md b/README.md index 66f30a4d..234f552d 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,11 @@ To preview updates without changing anything: dotnet new update --check-only ``` -To verify which version is installed / available: +To verify which versions/templates are installed / available: ```bash dotnet new list mudblazor +dotnet new list mudblazorwasm ``` If you want to reinstall manually (for example, to pin a specific version), uninstall and install again: @@ -60,6 +61,10 @@ dotnet new install MudBlazor.Templates:: ## Usage ### Common Commands +Templates included in this package: +- `mudblazor` = MudBlazor Web App (Blazor Web App / interactivity modes) +- `mudblazorwasm` = MudBlazor WebAssembly Standalone App + Create a new app (default is `Server` interactivity): ```bash dotnet new mudblazor -o MyMudApp @@ -130,6 +135,53 @@ For the complete option list (including advanced template options), run: dotnet new mudblazor --help ``` +### Standalone WASM (`mudblazorwasm`) + +Create a new standalone WebAssembly app: +```bash +dotnet new mudblazorwasm -o MyMudWasmApp +``` + +Create a standalone WebAssembly app with Individual auth (this also exercises the `MissingAuthority` guidance by default until provider values are configured): +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --auth Individual +``` + +Create a standalone WebAssembly app with Azure AD B2C auth: +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --auth IndividualB2C +``` + +Create a standalone WebAssembly app with single-tenant organizational auth: +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --auth SingleOrg +``` + +Create a standalone PWA: +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --pwa +``` + +Create an empty standalone app (omit sample/demo pages and styling): +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --empty +``` + +Create a standalone app using explicit `Program.Main`: +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --use-program-main +``` + +Generate the "Call Web API" sample navigation/page variant (B2C + non-default API settings): +```bash +dotnet new mudblazorwasm -o MyMudWasmApp --auth IndividualB2C --called-api-url https://example.com/api --called-api-scopes api.read +``` + +For the complete standalone WASM option list, run: +```bash +dotnet new mudblazorwasm --help +``` + ### Visual Studio Templates The templates can also be used in Visual Studio and should show up in the "Create a new project" template list. Common options map to Visual Studio's project creation UI, but the CLI examples above are the best reference for advanced combinations and flags. diff --git a/src/MudBlazor.Templates.csproj b/src/MudBlazor.Templates.csproj index 7632e47c..4bc9b8ec 100644 --- a/src/MudBlazor.Templates.csproj +++ b/src/MudBlazor.Templates.csproj @@ -4,7 +4,7 @@ MudBlazor.Templates - 4.0.1 + 4.1.0 MudBlazor Templates MudBlazor MudBlazor Team and Contributors @@ -44,6 +44,7 @@ + diff --git a/src/mudblazor-wasm/.template.config/dotnetcli.host.json b/src/mudblazor-wasm/.template.config/dotnetcli.host.json new file mode 100644 index 00000000..c68a8f73 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/dotnetcli.host.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://json.schemastore.org/dotnetcli.host", + "symbolInfo": { + "skipRestore": { + "longName": "no-restore", + "shortName": "" + }, + "PWA": { + "longName": "pwa" + }, + "Framework": { + "longName": "framework" + }, + "Empty": { + "longName": "empty" + }, + "IncludeSampleContent": { + "isHidden": true + }, + "UseLocalDB": { + "longName": "use-local-db" + }, + "AADInstance": { + "longName": "aad-instance", + "shortName": "" + }, + "AAdB2CInstance": { + "longName": "aad-b2c-instance", + "shortName": "" + }, + "SignUpSignInPolicyId": { + "longName": "susi-policy-id", + "shortName": "ssp" + }, + "OrgReadAccess": { + "longName": "org-read-access", + "shortName": "r" + }, + "ClientId": { + "longName": "client-id", + "shortName": "" + }, + "AppIDUri": { + "longName": "app-id-uri", + "shortName": "" + }, + "APIClientId": { + "longName": "api-client-id", + "shortName": "" + }, + "Domain": { + "longName": "domain", + "shortName": "" + }, + "TenantId": { + "longName": "tenant-id", + "shortName": "" + }, + "DefaultScope": { + "longName": "default-scope", + "shortName": "s" + }, + "Authority": { + "longName": "authority", + "shortName": "" + }, + "kestrelHttpPort": { + "isHidden": true + }, + "kestrelHttpsPort": { + "isHidden": true + }, + "iisHttpPort": { + "isHidden": true + }, + "iisHttpsPort": { + "isHidden": true + }, + "ExcludeLaunchSettings": { + "longName": "exclude-launch-settings", + "shortName": "" + }, + "UserSecretsId": { + "isHidden": true + }, + "NoHttps": { + "longName": "no-https", + "shortName": "" + }, + "CalledApiUrl": { + "longName": "called-api-url", + "shortName": "" + }, + "CalledApiScopes": { + "longName": "called-api-scopes", + "shortName": "" + }, + "CallsMicrosoftGraph": { + "longName": "calls-graph", + "shortName": "" + }, + "UseProgramMain": { + "longName": "use-program-main", + "shortName": "" + } + } +} diff --git a/src/mudblazor-wasm/.template.config/ide.host.json b/src/mudblazor-wasm/.template.config/ide.host.json new file mode 100644 index 00000000..9a551a8a --- /dev/null +++ b/src/mudblazor-wasm/.template.config/ide.host.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/ide.host", + "order": 610, + "icon": "ide/icon.ico", + "disableHttpsSymbol": "NoHttps", + "symbolInfo": [ + { + "id": "PWA", + "isVisible": true, + "persistenceScope": "templateGroup" + }, + { + "id": "UseProgramMain", + "isVisible": true, + "persistenceScope": "shared", + "persistenceScopeName": "Microsoft" + }, + { + "id": "IncludeSampleContent", + "isVisible": true, + "persistenceScope": "shared", + "persistenceScopeName": "Microsoft" + } + ] +} diff --git a/src/mudblazor-wasm/.template.config/ide/icon.ico b/src/mudblazor-wasm/.template.config/ide/icon.ico new file mode 100644 index 00000000..ae1de005 Binary files /dev/null and b/src/mudblazor-wasm/.template.config/ide/icon.ico differ diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.cs.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.cs.json new file mode 100644 index 00000000..d90b2436 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.cs.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Samostatná aplikace Blazor WebAssembly", + "description": "Šablona projektu pro vytvoření aplikace Blazor, která běží ve WebAssembly. Tato šablona se dá využít pro webové aplikace s propracovanými dynamickými uživatelskými rozhraními (UI).", + "symbols/Framework/description": "Cílová architektura pro projekt", + "symbols/Framework/choices/net10.0/description": "Cíl net10.0", + "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.", + "symbols/auth/choices/None/description": "Bez ověřování", + "symbols/auth/choices/Individual/description": "Ověřování Individual", + "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta", + "symbols/auth/description": "Typ ověřování, který se má použít", + "symbols/Authority/description": "Autorita poskytovatele OIDC (používá se se samostatným ověřováním Individual).", + "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).", + "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg).", + "symbols/ClientId/description": "ID klienta pro tento projekt (v samostatných scénářích se používá s ověřováním IndividualB2C, SingleOrg nebo Individual).", + "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).", + "symbols/AppIDUri/description": "Identifikátor URI ID aplikace pro serverové rozhraní API, které chceme volat (používá se s ověřováním SingleOrg nebo IndividualB2C).", + "symbols/APIClientId/description": "ID klienta pro rozhraní API, které server hostuje (používá se s IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Rozsah rozhraní API, který musí klient požádat o zřízení přístupového tokenu. (použijte s IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).", + "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg).", + "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).", + "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.", + "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).", + "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.", + "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).", + "symbols/PWA/displayName": "_Progresivní webová aplikace", + "symbols/PWA/description": "Pokud je tato možnost zadaná, vytvoří progresivní webovou aplikaci (PWA), která podporuje instalaci a offline použití.", + "symbols/IncludeSampleContent/displayName": "_Zahrnout ukázkové stránky", + "symbols/IncludeSampleContent/description": "Nastavuje, jestli se mají přidávat ukázkové stránky a styly pro demonstraci základních vzorů použití.", + "symbols/Empty/description": "Nastavuje, jestli se mají vynechat ukázkové stránky a styly, které demonstrují základní vzory použití.", + "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají Individual, IndividualB2C, SingleOrg ani MultiOrg.", + "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.", + "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C a také je zadán hostitel ASP.NET Core.", + "symbols/CalledApiScopes/description": "Obory, které se mají požádat žádat o volání rozhraní API z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C a také je zadán hostitel ASP.NET Core.", + "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně", + "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.", + "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.", + "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore", + "postActions/open-file/description": "Otevře soubor Readme.txt v editoru." +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.de.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.de.json new file mode 100644 index 00000000..d3ae0c93 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.de.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Eigenständige Blazor WebAssembly-App", + "description": "Eine Projektvorlage für das Erstellen einer Blazor-App, die in WebAssembly ausgeführt wird. Diese Vorlage kann für Web-Apps mit umfangreichen dynamischen Benutzeroberflächen verwendet werden.", + "symbols/Framework/description": "Das Zielframework für das Projekt.", + "symbols/Framework/choices/net10.0/description": "Ziel.-NET10.0", + "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.", + "symbols/auth/choices/None/description": "Keine Authentifizierung", + "symbols/auth/choices/Individual/description": "Individuelle Authentifizierung", + "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten", + "symbols/auth/description": "Der zu verwendende Authentifizierungstyp", + "symbols/Authority/description": "Die Autorität des OIDC Anbieters (Verwendung mit eigenständiger individueller Authentifizierung).", + "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).", + "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).", + "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg-Authentifizierung verwenden).", + "symbols/ClientId/description": "Die Client-ID für dieses Projekt (Verwendung mit IndividualB2C, SingleOrg oder Individual Auth in eigenständigen Szenarien).", + "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).", + "symbols/AppIDUri/description": "Der App ID URI für die Server-API, die wir aufrufen möchten (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).", + "symbols/APIClientId/description": "Die Client ID für die API, die der Server hostet (mit IndividualB2C, SingleOrg verwenden).", + "symbols/DefaultScope/description": "Der API Bereich, den der Client anfordern muss, um ein Zugriffstoken bereitzustellen. (Verwendung mit IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).", + "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg).", + "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).", + "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.", + "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.", + "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).", + "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.", + "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).", + "symbols/PWA/displayName": "_Progressive Webanwendung", + "symbols/PWA/description": "Wenn angegeben, wird eine Progressive Web Application (PWA) erstellt, die die Installation und Offlineverwendung unterstützt.", + "symbols/IncludeSampleContent/displayName": "_Include Beispielseiten", + "symbols/IncludeSampleContent/description": "Konfiguriert, ob Beispielseiten und Stile hinzugefügt werden, um grundlegende Verwendungsmuster zu veranschaulichen.", + "symbols/Empty/description": "Konfiguriert, ob Beispielseiten und Formatierungen weggelassen werden sollen, die grundlegende Verwendungsmuster veranschaulichen.", + "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn Individual, IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.", + "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.", + "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C ohne und ASP.NET Core-Host angegeben ist.", + "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C ohne und ASP.NET Core-Host angegeben ist.", + "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden", + "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.", + "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.", + "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen", + "postActions/open-file/description": "Öffnet Readme.txt im Editor" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.en.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.en.json new file mode 100644 index 00000000..04c7bc6d --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.en.json @@ -0,0 +1,45 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor WebAssembly Standalone App", + "description": "A project template for creating a Blazor WebAssembly standalone app. Based on the ASP.NET Core ComponentsWebAssembly-CSharp template and ready for MudBlazor customization.", + "symbols/Framework/description": "The target framework for the project.", + "symbols/Framework/choices/net10.0/description": "Target net10.0", + "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.", + "symbols/auth/choices/None/description": "No authentication", + "symbols/auth/choices/Individual/description": "Individual authentication", + "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant", + "symbols/auth/description": "The type of authentication to use", + "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).", + "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).", + "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).", + "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).", + "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).", + "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).", + "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).", + "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).", + "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).", + "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).", + "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.", + "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).", + "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.", + "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).", + "symbols/PWA/displayName": "_Progressive Web Application", + "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.", + "symbols/IncludeSampleContent/displayName": "_Include sample pages", + "symbols/IncludeSampleContent/description": "Configures whether to add sample pages and styling to demonstrate basic usage patterns.", + "symbols/Empty/description": "Configures whether to omit sample pages and styling that demonstrate basic usage patterns.", + "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.", + "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.", + "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.", + "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.", + "symbols/UseProgramMain/displayName": "Do not use _top-level statements", + "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.", + "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.", + "postActions/restore/description": "Restore NuGet packages required by this project.", + "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'", + "postActions/open-file/description": "Opens Readme.txt in the editor" +} diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.es.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.es.json new file mode 100644 index 00000000..24ea89e5 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.es.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Aplicación independiente WebAssembly de Blazor", + "description": "Plantilla de proyecto para crear una aplicación Blazor que se ejecuta en WebAssembly. Esta plantilla se puede usar para las aplicaciones web con interfaces de usuario dinámicas enriquecidas.", + "symbols/Framework/description": "Marco de destino del proyecto.", + "symbols/Framework/choices/net10.0/description": "Destino net10.0", + "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.", + "symbols/auth/choices/None/description": "Sin autenticación", + "symbols/auth/choices/Individual/description": "Autenticación individual", + "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino", + "symbols/auth/description": "El tipo de autenticación que se va a usar", + "symbols/Authority/description": "Autoridad del proveedor de OIDC (se usa con la autenticación individual independiente).", + "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).", + "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg).", + "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con IndividualB2C, SingleOrg o autenticación individual en escenarios independientes).", + "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).", + "symbols/AppIDUri/description": "Uri de id. de aplicación para la API de servidor a la que queremos llamar (se usa con la autenticación SingleOrg o IndividualB2C).", + "symbols/APIClientId/description": "Id. de cliente de la API que hospeda el servidor (se usa con IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Ámbito de API que el cliente debe solicitar para aprovisionar un token de acceso. (Se usa con IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).", + "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a SingleOrg).", + "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).", + "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.", + "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).", + "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.", + "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).", + "symbols/PWA/displayName": "_Aplicación web progresiva", + "symbols/PWA/description": "Si se especifica, produce una aplicación web progresiva (PWA) compatible con la instalación y el uso sin conexión.", + "symbols/IncludeSampleContent/displayName": "_Incluir páginas de ejemplo", + "symbols/IncludeSampleContent/description": "Configura si se van a agregar páginas de ejemplo y estilos para mostrar patrones de uso básicos.", + "symbols/Empty/description": "Configura si se omiten las páginas de ejemplo y los estilos que muestran patrones de uso básicos.", + "symbols/NoHttps/description": "Si se va a desactivar HTTPS. Esta opción solo se aplica si Individual, IndividualB2C, SingleOrg o MultiOrg no se usan para --auth.", + "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.", + "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C sin y se especifica ASP.NET host core.", + "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C sin y se especifica el host ASP.NET Core.", + "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior", + "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.", + "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.", + "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\"", + "postActions/open-file/description": "Abre Readme.txt en el editor" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.fr.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.fr.json new file mode 100644 index 00000000..7939ef72 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.fr.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Application Blazor WebAssembly autonome", + "description": "Modèle de projet permettant de créer une application Blazor qui s'exécute sur WebAssembly. Vous pouvez utiliser ce modèle pour les applications web ayant des IU (interfaces utilisateur) dynamiques riches.", + "symbols/Framework/description": "Framework cible du projet.", + "symbols/Framework/choices/net10.0/description": "Net10.0 cible", + "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.", + "symbols/auth/choices/None/description": "Aucune authentification", + "symbols/auth/choices/Individual/description": "Authentification individuelle", + "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire", + "symbols/auth/description": "Type d’authentification à utiliser", + "symbols/Authority/description": "Autorité du fournisseur OIDC (à utiliser avec l’authentification individuelle autonome).", + "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).", + "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg).", + "symbols/ClientId/description": "ID client de ce projet (utilisé avec IndividualB2C, SingleOrg ou l’authentification individuelle dans les scénarios autonomes).", + "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).", + "symbols/AppIDUri/description": "URI d’ID d’application pour l’API serveur que nous voulons appeler (à utiliser avec l’authentification SingleOrg ou IndividualB2C).", + "symbols/APIClientId/description": "ID client de l’API hébergée par le serveur (à utiliser avec IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Étendue d’API dont le client a besoin pour configurer un jeton d’accès. (à utiliser avec IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).", + "symbols/OrgReadAccess/description": "Indique si cette application doit ou non autoriser l’accès en lecture au répertoire (s’applique uniquement à SingleOrg).", + "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).", + "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.", + "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).", + "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.", + "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).", + "symbols/PWA/displayName": "_Application web progressive", + "symbols/PWA/description": "Si ce paramètre est spécifié, produit une application web progressive (PWA) qui prend en charge l’installation et l’utilisation hors connexion.", + "symbols/IncludeSampleContent/displayName": "_Inclure des exemples de pages", + "symbols/IncludeSampleContent/description": "Configure s'il faut ajouter des exemples de pages et de style pour illustrer les modèles d'utilisation de base.", + "symbols/Empty/description": "Configure s'il faut omettre les exemples de pages et le style qui illustrent les modèles d'utilisation de base.", + "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si Individual, IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.", + "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.", + "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sans et ASP.NET’hôte principal est spécifié.", + "symbols/CalledApiScopes/description": "Étendues où demander l’appel de l’API à partir de l’application web. Cette option s’applique uniquement si l’hôte --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sans et ASP.NET Core est spécifié.", + "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.", + "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.", + "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.", + "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »", + "postActions/open-file/description": "Ouvre Readme.txt dans l’éditeur" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.it.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.it.json new file mode 100644 index 00000000..e9514e42 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.it.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor App autonoma Blazor WebAssembly", + "description": "Modello di progetto per la creazione di un'app Blazor eseguita in WebAssembly. Questo modello può essere usato per app Web con interfacce utente dinamiche.", + "symbols/Framework/description": "Il framework di destinazione per il progetto.", + "symbols/Framework/choices/net10.0/description": "Destinazione net10.0", + "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.", + "symbols/auth/choices/None/description": "Nessuna autenticazione", + "symbols/auth/choices/Individual/description": "Autenticazione singola", + "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant", + "symbols/auth/description": "Tipo di autenticazione da usare.", + "symbols/Authority/description": "Autorità del provider OIDC (usare con l'autenticazione individuale autonoma).", + "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).", + "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg).", + "symbols/ClientId/description": "ID client per questo progetto (usare con IndividualB2C, SingleOrg o Autenticazione individuale in scenari autonomi).", + "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).", + "symbols/AppIDUri/description": "URI ID app per l'API server che si vuole chiamare (usare con l'autenticazione SingleOrg o IndividualB2C).", + "symbols/APIClientId/description": "ID client per l'API ospitata dal server (usare con IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Ambito API che il client deve richiedere per effettuare il provisioning di un token di accesso (usare con IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).", + "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo a SingleOrg).", + "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).", + "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.", + "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).", + "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.", + "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).", + "symbols/PWA/displayName": "Applicazione Web _Progressive", + "symbols/PWA/description": "Se specificato, produce un'applicazione Web progressiva (PWA) che supporta l'installazione e l'uso offline.", + "symbols/IncludeSampleContent/displayName": "_Include pagine di esempio", + "symbols/IncludeSampleContent/description": "Consente di configurare se aggiungere pagine di esempio e stile per mostrare modelli di utilizzo di base.", + "symbols/Empty/description": "Consente di configurare se omettere pagine di esempio e stile che mostrano modelli di utilizzo di base.", + "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se Individual, IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.", + "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.", + "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C without e host ASP.NET Core.", + "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C without e host ASP.NET Core.", + "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello", + "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.", + "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.", + "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'", + "postActions/open-file/description": "Apre Readme.txt nell'editor" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.ja.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.ja.json new file mode 100644 index 00000000..fee11699 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.ja.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Blazor WebAssembly スタンドアロン アプリ", + "description": "WebAssembly で実行される Blazor アプリを作成するためのプロジェクト テンプレート。このテンプレートは、高度でダイナミックなユーザー インターフェイス (UI) を備えた Web アプリに使用できます。", + "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。", + "symbols/Framework/choices/net10.0/description": "ターゲット net10.0", + "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。", + "symbols/auth/choices/None/description": "認証なし", + "symbols/auth/choices/Individual/description": "個別の認証", + "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証", + "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証", + "symbols/auth/description": "使用する認証の種類", + "symbols/Authority/description": "OIDC プロバイダーの権限 (個別のスタンドアロン認証で使用)。", + "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。", + "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。", + "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg 認証で使用)。", + "symbols/ClientId/description": "このプロジェクトのクライアント ID (スタンドアロン シナリオでは、IndividualB2C、SingleOrg、または個別の認証で使用します)。", + "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。", + "symbols/AppIDUri/description": "呼び出すサーバー API のアプリ ID URI (SingleOrg または IndividualB2C 認証で使用)。", + "symbols/APIClientId/description": "サーバーがホストする API のクライアント ID (IndividualB2C、SingleOrg で使用)。", + "symbols/DefaultScope/description": "アクセス トークンのプロビジョニングするためにクライアントが要求する必要がある API スコープ。(IndividualB2C、SingleOrg で使用)。", + "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。", + "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg にのみ適用されます)。", + "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。", + "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。", + "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。", + "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。", + "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。", + "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。", + "symbols/PWA/displayName": "プログレッシブ Web アプリケーション(_P)", + "symbols/PWA/description": "指定した場合、インストールとオフラインでの使用をサポートするプログレッシブ Web アプリケーション (PWA) が生成されます。", + "symbols/IncludeSampleContent/displayName": "サンプル ページを含める(_I)", + "symbols/IncludeSampleContent/description": "基本的な使用パターンを示すサンプル ページとスタイルを追加するかどうかを構成します。", + "symbols/Empty/description": "基本的な使用パターンを示すサンプル ページとスタイルを省略するかどうかを構成します。", + "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、Individual、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。", + "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。", + "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C で、ASP.NET Core ホストが指定されていない場合にのみ適用されます。", + "symbols/CalledApiScopes/description": "Web アプリから API を呼び出すために要求するスコープ。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C で、ASP.NET Core ホストが指定されていない場合にのみ適用されます。", + "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)", + "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。", + "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。", + "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する", + "postActions/open-file/description": "エディターで Readme.txt を開きます" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.ko.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.ko.json new file mode 100644 index 00000000..1e65c255 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.ko.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Blazor WebAssembly 독립 실행형 앱", + "description": "WebAssembly에서 실행되는 Blazor 앱을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿을 사용하여 다양한 동적 UI(사용자 인터페이스)가 포함된 웹앱을 만들 수 있습니다.", + "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.", + "symbols/Framework/choices/net10.0/description": "대상 net10.0", + "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.", + "symbols/auth/choices/None/description": "인증 없음", + "symbols/auth/choices/Individual/description": "개별 인증", + "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증", + "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증", + "symbols/auth/description": "사용할 인증 유형", + "symbols/Authority/description": "OIDC 제공자의 권한(독립형 개별 인증과 함께 사용).", + "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).", + "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).", + "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 인증과 함께 사용).", + "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(독립형 시나리오에서 IndividualB2C, SingleOrg 또는 Individual auth와 함께 사용).", + "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).", + "symbols/AppIDUri/description": "호출하려는 서버 API의 앱 ID Uri입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).", + "symbols/APIClientId/description": "서버가 호스팅하는 API의 클라이언트 ID입니다(IndividualB2C, SingleOrg와 함께 사용).", + "symbols/DefaultScope/description": "클라이언트가 액세스 토큰을 프로비전하기 위해 요청해야 하는 API 범위입니다. (IndividualB2C, SingleOrg와 함께 사용).", + "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).", + "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg에만 적용됨).", + "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).", + "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.", + "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.", + "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).", + "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.", + "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).", + "symbols/PWA/displayName": "프로그레시브 웹 애플리케이션(_P)", + "symbols/PWA/description": "지정된 경우 설치 및 오프라인 사용을 지원하는 PWA(프로그레시브 웹 응용 프로그램)를 생성합니다.", + "symbols/IncludeSampleContent/displayName": "샘플 페이지 포함(_I)", + "symbols/IncludeSampleContent/description": "기본 사용 패턴을 보여주기 위해 샘플 페이지 및 스타일을 추가할지 여부를 구성합니다.", + "symbols/Empty/description": "기본 사용 패턴을 보여주는 샘플 페이지 및 스타일을 생략할지 여부를 구성합니다.", + "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 Individual, IndividualB2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.", + "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.", + "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C without and ASP.NET Core 호스트가 지정된 경우에만 적용됩니다.", + "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C without and ASP.NET Core 호스트가 지정된 경우에만 적용됩니다.", + "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)", + "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.", + "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.", + "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행", + "postActions/open-file/description": "편집기에서 Readme.txt를 엽니다." +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.pl.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.pl.json new file mode 100644 index 00000000..75e65afb --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.pl.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Autonomiczna aplikacja zestawu WebAssembly platformy Blazor", + "description": "Szablon projektu służący do tworzenia aplikacji Blazor działającej na zestawie WebAssembly. Ten szablon może być używany dla aplikacji internetowych z rozbudowanymi, dynamicznymi interfejsami użytkowników.", + "symbols/Framework/description": "Platforma docelowa dla tego projektu.", + "symbols/Framework/choices/net10.0/description": "Docelowa platforma net10.0", + "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.", + "symbols/auth/choices/None/description": "Bez uwierzytelniania", + "symbols/auth/choices/Individual/description": "Uwierzytelnianie indywidualne", + "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy", + "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.", + "symbols/Authority/description": "Urząd dostawcy OIDC (użyj z autonomicznym indywidualnym uwierzytelnianym).", + "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).", + "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym SingleOrg ).", + "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (używany z uwierzytelnianiem IndividualB2C, SingleOrg lub Individual w scenariuszach autonomicznych).", + "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).", + "symbols/AppIDUri/description": "Identyfikator URI identyfikatora aplikacji dla interfejsu API serwera, który chcemy wywołać (użyj z uwierzytelnianym SingleOrg lub IndividualB2C).", + "symbols/APIClientId/description": "Identyfikator klienta dla interfejsu API hostowanego przez serwer (używany z elementem IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Zakres interfejsu API, który klient musi zażądać w celu aprowizacji tokenu dostępu. (użyj z uwierzytelnianiem singleB2C, SingleOrg).", + "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).", + "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg).", + "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).", + "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.", + "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).", + "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.", + "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth, parametr no-https zostanie zignorowana).", + "symbols/PWA/displayName": "_Progresywna aplikacja internetowa", + "symbols/PWA/description": "Jeśli zostanie określony, tworzy progresywną aplikację internetową (PWA) obsługującą instalację i używanie w trybie offline.", + "symbols/IncludeSampleContent/displayName": "_Dołącz przykładowe strony", + "symbols/IncludeSampleContent/description": "Konfiguruje, czy dodać przykładowe strony i style w celu zademonstrowania podstawowych wzorców użycia.", + "symbols/Empty/description": "Konfiguruje, czy pomijać przykładowe strony i style demonstrujące podstawowe wzorce użycia.", + "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy dla uwierzytelniania --auth nie są używane elementy Individual, IndividualB2C, SingleOrg lub MultiOrg.", + "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.", + "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C bez hosta platformy ASP.NET Core.", + "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania interfejsu API z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C bez hosta platformy ASP.NET Core.", + "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu", + "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.", + "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.", + "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\"", + "postActions/open-file/description": "Otwiera plik Readme.txt w edytorze" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.pt-BR.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.pt-BR.json new file mode 100644 index 00000000..ac22c198 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.pt-BR.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Aplicativo Autônomo Blazor WebAssembly", + "description": "Um modelo de projeto para criar um aplicativo Blazor que é executado no WebAssembly. Esse modelo pode ser usado para aplicativos Web com UIs (interfaces do usuário) completas e dinâmicas.", + "symbols/Framework/description": "A estrutura de destino do projeto.", + "symbols/Framework/choices/net10.0/description": "Net10.0 de destino", + "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.", + "symbols/auth/choices/None/description": "Sem autenticação", + "symbols/auth/choices/Individual/description": "Autenticação individual", + "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário", + "symbols/auth/description": "O tipo de autenticação a ser usado", + "symbols/Authority/description": "A autoridade do provedor OIDC (use com autenticação individual autônoma).", + "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).", + "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg).", + "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação IndividualB2C, SingleOrg ou Individual em cenários autônomos).", + "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).", + "symbols/AppIDUri/description": "O App ID Uri para a API do servidor que queremos chamar (use com autenticação SingleOrg ou IndividualB2C).", + "symbols/APIClientId/description": "O ID do cliente para a API que o servidor hospeda (use com IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "O escopo da API que o cliente precisa solicitar para provisionar um token de acesso. (use com IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).", + "symbols/OrgReadAccess/description": "Se deve ou não permitir que este aplicativo tenha acesso de leitura ao diretório (aplica-se apenas a SingleOrg).", + "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).", + "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.", + "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).", + "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.", + "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).", + "symbols/PWA/displayName": "_Aplicativo da Web Progressivo", + "symbols/PWA/description": "Se especificado, produz um Progressive Web Application (PWA) com suporte para instalação e uso offline.", + "symbols/IncludeSampleContent/displayName": "_Incluir páginas de amostra", + "symbols/IncludeSampleContent/description": "Configura se deseja adicionar páginas de amostra e estilo para demonstrar padrões de uso básicos.", + "symbols/Empty/description": "Configura a omissão de páginas de amostra e estilo que demonstram padrões básicos de uso.", + "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção se aplica somente se Individual, IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.", + "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.", + "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Essa opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sem um host ASP.NET Core for especificado.", + "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Essa opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sem um host ASP.NET Core for especificado.", + "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior", + "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.", + "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.", + "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'", + "postActions/open-file/description": "Abre Readme.txt no editor" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.ru.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.ru.json new file mode 100644 index 00000000..2687a228 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.ru.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Изолированное приложение Blazor WebAssembly", + "description": "Шаблон проекта для создания приложения Blazor, которое запускается в WebAssembly. Этот шаблон можно использовать для веб-приложений с полнофункциональными динамическими пользовательскими интерфейсами.", + "symbols/Framework/description": "Целевая платформа для проекта.", + "symbols/Framework/choices/net10.0/description": "Целевая платформа .NET 10.0", + "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.", + "symbols/auth/choices/None/description": "Без проверки подлинности", + "symbols/auth/choices/Individual/description": "Индивидуальная проверка подлинности", + "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C", + "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента", + "symbols/auth/description": "Тип используемой проверки подлинности", + "symbols/Authority/description": "Полномочия поставщика OIDC (используются с автономной проверкой подлинности Individual).", + "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).", + "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).", + "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).", + "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности IndividualB2C, SingleOrg или Individual в автономных сценариях).", + "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).", + "symbols/AppIDUri/description": "URI идентификатора приложения для API сервера, который требуется вызвать (используется с проверкой подлинности SingleOrg или IndividualB2C).", + "symbols/APIClientId/description": "Идентификатор клиента для API, размещенного на сервере (используется с IndividualB2C, SingleOrg).", + "symbols/DefaultScope/description": "Область API, необходимая клиенту для запроса на подготовку маркера доступа (используется с IndividualB2C, SingleOrg).", + "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).", + "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к SingleOrg).", + "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).", + "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.", + "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.", + "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).", + "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.", + "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).", + "symbols/PWA/displayName": "_Прогрессивное веб-приложение", + "symbols/PWA/description": "Если указывается, используется для создания прогрессивного веб-приложения (PWA), поддерживающего установку и автономное использование.", + "symbols/IncludeSampleContent/displayName": "_Включить примеры страниц", + "symbols/IncludeSampleContent/description": "Настраивает, следует ли добавлять примеры страниц и стили для демонстрации базовых шаблонов использования.", + "symbols/Empty/description": "Настраивает, следует ли пропускать примеры страниц и стили, демонстрирующие базовые шаблоны использования.", + "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются Individual, IndividualB2C, SingleOrg или MultiOrg.", + "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.", + "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C без узла ASP.NET Core.", + "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C без узла ASP.NET Core.", + "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня", + "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.", + "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.", + "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\"", + "postActions/open-file/description": "Открывает Readme.txt в редакторе" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.tr.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.tr.json new file mode 100644 index 00000000..56f5c6c5 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.tr.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Blazor WebAssembly Tek Başına Uygulaması", + "description": "WebAssembly üzerinde çalışan bir Blazor uygulaması oluşturmaya yönelik proje şablonu. Bu şablon, zengin dinamik kullanıcı arabirimlerine (UI) sahip web uygulamaları için kullanılabilir.", + "symbols/Framework/description": "Projenin hedef çerçevesi.", + "symbols/Framework/choices/net10.0/description": "Hedef net10.0", + "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.", + "symbols/auth/choices/None/description": "Kimlik doğrulaması yok", + "symbols/auth/choices/Individual/description": "Bireysel kimlik doğrulaması", + "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması", + "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması", + "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü", + "symbols/Authority/description": "OIDC sağlayıcısının yetkisi (tek başına Bireysel kimlik doğrulaması ile kullanın).", + "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).", + "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).", + "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg kimlik doğrulaması ile kullanın).", + "symbols/ClientId/description": "Bu projenin İstemci Kimliği (tek başına senaryolarda IndividualB2C, SingleOrg veya Bireysel kimlik doğrulaması ile kullanın).", + "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).", + "symbols/AppIDUri/description": "Çağrılmak istenen sunucu API'sinin Uygulama Kimliği Uri'si (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).", + "symbols/APIClientId/description": "Sunucunun barındırmış olduğu API için İstemci Kimliği (IndividualB2C, SingleOrg ile kullanın).", + "symbols/DefaultScope/description": "İstemcinin erişim belirteci sağlamak amacıyla istekte bulunmak için ihtiyacı olan API kapsamı. (IndividualB2C, SingleOrg ile kullanın).", + "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).", + "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg için geçerlidir).", + "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).", + "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.", + "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.", + "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).", + "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.", + "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).", + "symbols/PWA/displayName": "_Aşamalı Web Uygulaması", + "symbols/PWA/description": "Belirtilmişse, yükleme ve çevrimdışı kullanımı destekleyen bir Aşamalı Web Uygulaması (PWA) oluşturur.", + "symbols/IncludeSampleContent/displayName": "Örnek _sayfalar ekle", + "symbols/IncludeSampleContent/description": "Temel kullanım düzenlerini göstermek için örnek sayfaların ve stil oluşturma özelliklerinin eklenip eklenmeyeceğini yapılandırır.", + "symbols/Empty/description": "Temel kullanım düzenlerini gösteren örnek sayfaların ve stil oluşturma özelliklerinin atlanıp atlanmayacağını yapılandırır.", + "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca Bireysel, IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.", + "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.", + "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C without ve ASP.NET Core konağı belirtilirse geçerlidir.", + "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C without ve ASP.NET Core konağı belirtilirse geçerlidir.", + "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın", + "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.", + "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.", + "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır", + "postActions/open-file/description": "Benioku.txt dosyasını düzenleyicide açar" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hans.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hans.json new file mode 100644 index 00000000..12ed84a8 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hans.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Blazor WebAssembly 独立应用", + "description": "用于创建在 WebAssembly 上运行的 Blazor 应用的项目模板。此模板可用于具有丰富动态用户界面(UI)的 Web 应用。", + "symbols/Framework/description": "项目的目标框架。", + "symbols/Framework/choices/net10.0/description": "目标 net10.0", + "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。", + "symbols/auth/choices/None/description": "无身份验证", + "symbols/auth/choices/Individual/description": "个人身份验证", + "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证", + "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证", + "symbols/auth/description": "要使用的身份验证类型", + "symbols/Authority/description": "OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。", + "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。", + "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。", + "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。", + "symbols/ClientId/description": "此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。", + "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。", + "symbols/AppIDUri/description": "要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。", + "symbols/APIClientId/description": "服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。", + "symbols/DefaultScope/description": "客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。", + "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。", + "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。", + "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。", + "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。", + "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。", + "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。", + "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。", + "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。", + "symbols/PWA/displayName": "渐进式 Web 应用程序(_P)", + "symbols/PWA/description": "如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。", + "symbols/IncludeSampleContent/displayName": "包含示例页(_I)", + "symbols/IncludeSampleContent/description": "配置是否添加示例页和样式以演示基本使用模式。", + "symbols/Empty/description": "配置是否忽略演示基本使用模式的示例页和样式。", + "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。", + "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。", + "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。", + "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。", + "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)", + "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。", + "postActions/restore/description": "还原此项目所需的 NuGet 包。", + "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\"", + "postActions/open-file/description": "在编辑器中打开 Readme.txt" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hant.json b/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hant.json new file mode 100644 index 00000000..7f413a12 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/localize/templatestrings.zh-Hant.json @@ -0,0 +1,44 @@ +{ + "author": "MudBlazor", + "name": "MudBlazor Blazor WebAssembly 獨立應用程式", + "description": "用來建立在 WebAssembly 上執行之 Blazor 應用程式的專案範本。此範本可用於具有豐富動態使用者介面 (UI) 的 Web 應用程式。", + "symbols/Framework/description": "專案的目標 Framework。", + "symbols/Framework/choices/net10.0/description": "目標 net10.0", + "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。", + "symbols/auth/choices/None/description": "沒有驗證", + "symbols/auth/choices/Individual/description": "個別驗證", + "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證", + "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證", + "symbols/auth/description": "要使用的驗證類型。", + "symbols/Authority/description": "OIDC 提供者的授權(搭配獨立個別驗證使用)。", + "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。", + "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。", + "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 驗證使用)。", + "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配獨立案例中的 IndividualB2C、SingleOrg 或 Individual 驗證使用)。", + "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。", + "symbols/AppIDUri/description": "要呼叫的伺服器 API App ID URI (搭配 SingleOrg 或 IndividualB2C 驗證使用)。", + "symbols/APIClientId/description": "伺服器裝載之 API 的用戶端識別碼 (搭配 IndividualB2C、SingleOrg 使用)。", + "symbols/DefaultScope/description": "用戶端佈建存取權杖所需的 API 範圍。(搭配 IndividualB2C、SingleOrg 使用)。", + "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。", + "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg)。", + "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。", + "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。", + "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。", + "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。", + "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。", + "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。", + "symbols/PWA/displayName": "漸進式 Web 應用程式(_P)", + "symbols/PWA/description": "若指定,會產生漸進式 Web 應用程式 (PWA) 支援安裝與離線使用。", + "symbols/IncludeSampleContent/displayName": "包含範例頁面(_I)", + "symbols/IncludeSampleContent/description": "設定是否要新增範例頁面和樣式,以示範基本使用模式。", + "symbols/Empty/description": "設定是否要省略範例頁面和樣式,其示範基本使用模式。", + "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 Individual、IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。", + "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。", + "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時 (不含 ASP.NET Core 主機),才適用此選項。", + "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時 (不含 ASP.NET Core 主機),才適用此選項。", + "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)", + "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。", + "postActions/restore/description": "還原此專案所需的 NuGet 套件。", + "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'", + "postActions/open-file/description": "在編輯器中開啟 Readme.txt" +} \ No newline at end of file diff --git a/src/mudblazor-wasm/.template.config/template.json b/src/mudblazor-wasm/.template.config/template.json new file mode 100644 index 00000000..0c97a4f3 --- /dev/null +++ b/src/mudblazor-wasm/.template.config/template.json @@ -0,0 +1,489 @@ +{ + "$schema": "https://json.schemastore.org/template", + "author": "MudBlazor", + "classifications": [ + "Web", + "Blazor", + "WebAssembly", + "PWA", + "MudBlazor" + ], + "name": "MudBlazor WebAssembly Standalone App", + "defaultName": "MudBlazorWasmApp", + "description": "A project template for creating a Blazor WebAssembly standalone app. Based on the ASP.NET Core ComponentsWebAssembly-CSharp template and ready for MudBlazor customization.", + "groupIdentity": "MudBlazor.Web.Blazor.WasmStandalone", + "precedence": "9800", + "guids": [ + "4C26868E-5E7C-458D-82E3-040509D0C71F", + "5990939C-7E7B-4CFA-86FF-44CA5756498A", + "650B3CE7-2E93-4CC4-9F46-466686815EAA", + "0AFFA7FD-4E37-4636-AB91-3753E746DB98", + "53bc9b9d-9d6a-45d4-8429-2a2761773502" // Client ID + ], + "identity": "MudBlazor.Web.Blazor.WasmStandalone.CSharp.10.0", + "thirdPartyNotices": "", + "preferNameDirectory": true, + "primaryOutputs": [ + { + "path": "ComponentsWebAssembly-CSharp.csproj" + } + ], + "shortName": "mudblazorwasm", + "sourceName": "ComponentsWebAssembly-CSharp", + "sources": [ + { + "source": "./", + "target": "./", + "exclude": [ + ".template.config/**" + ], + "modifiers": [ + { + "condition": "(!PWA)", + "exclude": [ + "wwwroot/service-worker*.js", + "wwwroot/manifest.webmanifest", + "wwwroot/icon-512.png" + ] + }, + { + "condition": "(!UseProgramMain)", + "exclude": [ + "Program.Main.cs" + ] + }, + { + "condition": "(UseProgramMain)", + "exclude": [ + "Program.cs" + ], + "rename": { + "Program.Main.cs": "Program.cs" + } + }, + { + "condition": "(!IndividualLocalAuth)", + "exclude": [ + "wwwroot/appsettings.Development.json" + ] + }, + { + "condition": "(NoAuth)", + "rename": { + "Layout/MainLayout.NoAuth.razor": "Layout/MainLayout.razor" + }, + "exclude": [ + "Pages/Authentication.razor", + "Layout/LoginDisplay.razor", + "Layout/MainLayout.Auth.razor", + "Layout/RedirectToLogin.razor", + "wwwroot/appsettings.Development.json", + "wwwroot/appsettings.json" + ] + }, + { + "condition": "(!NoAuth)", + "rename": { + "Layout/MainLayout.Auth.razor": "Layout/MainLayout.razor" + }, + "exclude": [ + "Layout/MainLayout.NoAuth.razor" + ] + }, + { + "condition": "(!GenerateApi)", + "rename": { + "Layout/NavMenu.NoApi.razor": "Layout/NavMenu.razor" + }, + "exclude": [ + "Pages/CallWebApi.razor", + "Layout/NavMenu.CallsWebApi.razor" + ] + }, + { + "condition": "(GenerateApi)", + "rename": { + "Layout/NavMenu.CallsWebApi.razor": "Layout/NavMenu.razor" + }, + "exclude": [ + "Layout/NavMenu.NoApi.razor" + ] + }, + { + "condition": "(ExcludeLaunchSettings)", + "exclude": [ + "Properties/launchSettings.json" + ] + }, + { + "condition": "(!SampleContent)", + "exclude": [ + "Pages/Counter.*", + "Pages/Weather.*", + "Layout/MainLayout.razor.css", + "Layout/NavMenu.*", + "wwwroot/lib/**", + "wwwroot/favicon.png", + "wwwroot/sample-data/weather.json" + ] + } + ] + } + ], + "symbols": { + "Framework": { + "type": "parameter", + "description": "The target framework for the project.", + "datatype": "choice", + "choices": [ + { + "choice": "net10.0", + "description": "Target net10.0" + } + ], + "replaces": "net10.0", + "defaultValue": "net10.0" + }, + "HostIdentifier": { + "type": "bind", + "binding": "HostIdentifier" + }, + "skipRestore": { + "type": "parameter", + "datatype": "bool", + "description": "If specified, skips the automatic restore of the project on create.", + "defaultValue": "false" + }, + "auth": { + "type": "parameter", + "datatype": "choice", + "choices": [ + { + "choice": "None", + "description": "No authentication" + }, + { + "choice": "Individual", + "description": "Individual authentication" + }, + { + "choice": "IndividualB2C", + "description": "Individual authentication with Azure AD B2C" + }, + { + "choice": "SingleOrg", + "description": "Organizational authentication for a single tenant" + } + ], + "defaultValue": "None", + "description": "The type of authentication to use" + }, + "Authority": { + "type": "parameter", + "datatype": "string", + "replaces": "https://login.microsoftonline.com/", + "description": "The authority of the OIDC provider (use with standalone Individual auth)." + }, + "MissingAuthority": { + "type": "computed", + "value": "(IndividualAuth && Authority == \"https://login.microsoftonline.com/\" && ClientId == \"33333333-3333-3333-33333333333333333\")" + }, + "AAdB2CInstance": { + "type": "parameter", + "datatype": "string", + "replaces": "https:////aadB2CInstance.b2clogin.com/", + "description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth)." + }, + "SignUpSignInPolicyId": { + "type": "parameter", + "datatype": "string", + "defaultValue": "b2c_1_susi", + "replaces": "MySignUpSignInPolicyId", + "description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth)." + }, + "AADInstance": { + "type": "parameter", + "datatype": "string", + "defaultValue": "https://login.microsoftonline.com/", + "replaces": "https:////login.microsoftonline.com/", + "description": "The Azure Active Directory instance to connect to (use with SingleOrg auth)." + }, + "ClientId": { + "type": "parameter", + "datatype": "string", + "replaces": "33333333-3333-3333-33333333333333333", + "description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios)." + }, + "Domain": { + "type": "parameter", + "datatype": "string", + "replaces": "qualified.domain.name", + "description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth)." + }, + "AppIDUri": { + "type": "parameter", + "datatype": "string", + "replaces": "api.id.uri", + "description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth)." + }, + "APIClientId": { + "type": "parameter", + "datatype": "string", + "replaces": "11111111-1111-1111-11111111111111111", + "description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg)." + }, + "DefaultScope": { + "type": "parameter", + "datatype": "string", + "replaces": "api-scope", + "defaultValue": "access_as_user", + "description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg)." + }, + "TenantId": { + "type": "parameter", + "datatype": "string", + "replaces": "22222222-2222-2222-2222-222222222222", + "description": "The TenantId ID of the directory to connect to (use with SingleOrg auth)." + }, + "OrgReadAccess": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg)." + }, + "UserSecretsId": { + "type": "parameter", + "datatype": "string", + "replaces": "aspnet-BlazorServerWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502", + "defaultValue": "aspnet-BlazorServerWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502", + "description": "The ID to use for secrets (use with OrgReadAccess or Individual auth)." + }, + "ExcludeLaunchSettings": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "description": "Whether to exclude launchSettings.json from the generated template." + }, + "kestrelHttpPort": { + "type": "parameter", + "datatype": "integer", + "description": "Port number to use for the HTTP endpoint in launchSettings.json." + }, + "kestrelHttpPortGenerated": { + "type": "generated", + "generator": "port", + "parameters": { + "low": 5000, + "high": 5300 + } + }, + "kestrelHttpPortReplacer": { + "type": "generated", + "generator": "coalesce", + "parameters": { + "sourceVariableName": "kestrelHttpPort", + "fallbackVariableName": "kestrelHttpPortGenerated" + }, + "replaces": "5000" + }, + "kestrelHttpsPort": { + "type": "parameter", + "datatype": "integer", + "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)." + }, + "kestrelHttpsPortGenerated": { + "type": "generated", + "generator": "port", + "parameters": { + "low": 7000, + "high": 7300 + } + }, + "kestrelHttpsPortReplacer": { + "type": "generated", + "generator": "coalesce", + "parameters": { + "sourceVariableName": "kestrelHttpsPort", + "fallbackVariableName": "kestrelHttpsPortGenerated" + }, + "replaces": "5001" + }, + "iisHttpPort": { + "type": "parameter", + "datatype": "integer", + "description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json." + }, + "iisHttpPortGenerated": { + "type": "generated", + "generator": "port" + }, + "iisHttpPortReplacer": { + "type": "generated", + "generator": "coalesce", + "parameters": { + "sourceVariableName": "iisHttpPort", + "fallbackVariableName": "iisHttpPortGenerated" + }, + "replaces": "8080" + }, + "iisHttpsPort": { + "type": "parameter", + "datatype": "integer", + "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)." + }, + "iisHttpsPortGenerated": { + "type": "generated", + "generator": "port", + "parameters": { + "low": 44300, + "high": 44399 + } + }, + "iisHttpsPortReplacer": { + "type": "generated", + "generator": "coalesce", + "parameters": { + "sourceVariableName": "iisHttpsPort", + "fallbackVariableName": "iisHttpsPortGenerated" + }, + "replaces": "44300" + }, + "PWA": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "displayName": "_Progressive Web Application", + "description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use." + }, + "OrganizationalAuth": { + "type": "computed", + "value": "(auth == \"SingleOrg\" || auth == \"MultiOrg\")" + }, + "MultiOrgAuth": { + "type": "computed", + "value": "(auth == \"MultiOrg\")" + }, + "SingleOrgAuth": { + "type": "computed", + "value": "(auth == \"SingleOrg\")" + }, + "IndividualLocalAuth": { + "type": "computed", + "value": "(auth == \"Individual\")" + }, + "IndividualAuth": { + "type": "computed", + "value": "(auth == \"Individual\" || auth == \"IndividualB2C\")" + }, + "IndividualB2CAuth": { + "type": "computed", + "value": "(auth == \"IndividualB2C\")" + }, + "IncludeSampleContent": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "true", + "displayName": "_Include sample pages", + "description": "Configures whether to add sample pages and styling to demonstrate basic usage patterns." + }, + "Empty": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "description": "Configures whether to omit sample pages and styling that demonstrate basic usage patterns." + }, + "SampleContent": { + "type": "computed", + "value": "(((IncludeSampleContent && (HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\"))) || ((!Empty && (HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\"))))" + }, + "NoAuth": { + "type": "computed", + "value": "(!(IndividualAuth || OrganizationalAuth))" + }, + "RequiresHttps": { + "type": "computed", + "value": "(OrganizationalAuth || IndividualAuth)" + }, + "HasHttpProfile": { + "type": "computed", + "value": "(!RequiresHttps)" + }, + "HasHttpsProfile": { + "type": "computed", + "value": "(RequiresHttps || !NoHttps)" + }, + "NoHttps": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth." + }, + "UseLocalDB": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified." + }, + "copyrightYear": { + "type": "generated", + "generator": "now", + "replaces": "copyrightYear", + "parameters": { + "format": "yyyy" + } + }, + "CalledApiUrl": { + "type": "parameter", + "datatype": "string", + "replaces": "[WebApiUrl]", + "defaultValue": "https://graph.microsoft.com/v1.0", + "description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified." + }, + "CalledApiScopes": { + "type": "parameter", + "datatype": "string", + "replaces": "user.read", + "description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified." + }, + "GenerateApi": { + "type": "computed", + "value": "(IndividualB2CAuth && (CalledApiUrl != \"https://graph.microsoft.com/v1.0\" || CalledApiScopes != \"user.read\"))" + }, + "UseProgramMain": { + "type": "parameter", + "datatype": "bool", + "defaultValue": "false", + "displayName": "Do not use _top-level statements", + "description": "Whether to generate an explicit Program class and Main method instead of top-level statements." + } + }, + "tags": { + "language": "C#", + "type": "project" + }, + "postActions": [ + { + "id": "restore", + "condition": "(!skipRestore)", + "description": "Restore NuGet packages required by this project.", + "manualInstructions": [ + { + "text": "Run 'dotnet restore'" + } + ], + "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025", + "continueOnError": true + }, + { + "id": "open-file", + "condition": "(IndividualLocalAuth && HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")", + "description": "Opens Readme.txt in the editor", + "manualInstructions": [], + "actionId": "84C0DA21-51C8-4541-9940-6CA19AF04EE6", + "args": { + "files": "0" + }, + "continueOnError": true + } + ] +} diff --git a/src/mudblazor-wasm/App.razor b/src/mudblazor-wasm/App.razor new file mode 100644 index 00000000..c177d88d --- /dev/null +++ b/src/mudblazor-wasm/App.razor @@ -0,0 +1,28 @@ +@*#if (NoAuth) + + + + + + +#else + + + + + + @if (context.User.Identity?.IsAuthenticated != true) + { + + } + else + { +

You are not authorized to access this resource.

+ } +
+
+ +
+
+
+#endif*@ diff --git a/src/mudblazor-wasm/ComponentsWebAssembly-CSharp.csproj b/src/mudblazor-wasm/ComponentsWebAssembly-CSharp.csproj new file mode 100644 index 00000000..c164b5b5 --- /dev/null +++ b/src/mudblazor-wasm/ComponentsWebAssembly-CSharp.csproj @@ -0,0 +1,27 @@ + + + + net10.0 + enable + enable + true + + service-worker-assets.js + + + + + + + + + + + + + + + + + + diff --git a/src/mudblazor-wasm/Layout/LoginDisplay.razor b/src/mudblazor-wasm/Layout/LoginDisplay.razor new file mode 100644 index 00000000..21b0d199 --- /dev/null +++ b/src/mudblazor-wasm/Layout/LoginDisplay.razor @@ -0,0 +1,19 @@ +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@inject NavigationManager Navigation + + + + Hello, @context.User.Identity?.Name! + Log out + + + Log in + + + +@code{ + public void BeginLogOut() + { + Navigation.NavigateToLogout("authentication/logout"); + } +} diff --git a/src/mudblazor-wasm/Layout/MainLayout.Auth.razor b/src/mudblazor-wasm/Layout/MainLayout.Auth.razor new file mode 100644 index 00000000..1c77d7b4 --- /dev/null +++ b/src/mudblazor-wasm/Layout/MainLayout.Auth.razor @@ -0,0 +1,106 @@ +@inherits LayoutComponentBase + + + + + + +@*#if (SampleContent) --> + + + + Application + + + + + About + + + + + + + + + @Body + + +##else + + +@Body +##endif*@ + +@code { + private bool _drawerOpen = true; + private bool _isDarkMode = true; + private MudTheme? _theme; + + protected override void OnInitialized() + { + base.OnInitialized(); + + _theme = new() + { + PaletteLight = _lightPalette, + PaletteDark = _darkPalette, + LayoutProperties = new LayoutProperties() + }; + } + + private void DrawerToggle() + { + _drawerOpen = !_drawerOpen; + } + + private void DarkModeToggle() + { + _isDarkMode = !_isDarkMode; + } + + private readonly PaletteLight _lightPalette = new() + { + Black = "#110e2d", + AppbarText = "#424242", + AppbarBackground = "rgba(255,255,255,0.8)", + DrawerBackground = "#ffffff", + GrayLight = "#e8e8e8", + GrayLighter = "#f9f9f9", + }; + + private readonly PaletteDark _darkPalette = new() + { + Primary = "#7e6fff", + Surface = "#1e1e2d", + Background = "#1a1a27", + BackgroundGray = "#151521", + AppbarText = "#92929f", + AppbarBackground = "rgba(26,26,39,0.8)", + DrawerBackground = "#1a1a27", + ActionDefault = "#74718e", + ActionDisabled = "#9999994d", + ActionDisabledBackground = "#605f6d4d", + TextPrimary = "#b2b0bf", + TextSecondary = "#92929f", + TextDisabled = "#ffffff33", + DrawerIcon = "#92929f", + DrawerText = "#92929f", + GrayLight = "#2a2833", + GrayLighter = "#1e1e2d", + Info = "#4a86ff", + Success = "#3dcb6c", + Warning = "#ffb545", + Error = "#ff3f5f", + LinesDefault = "#33323e", + TableLines = "#33323e", + Divider = "#292838", + OverlayLight = "#1e1e2d80", + }; + + public string DarkLightModeButtonIcon => _isDarkMode switch + { + true => Icons.Material.Rounded.AutoMode, + false => Icons.Material.Outlined.DarkMode, + }; +} diff --git a/src/mudblazor-wasm/Layout/MainLayout.NoAuth.razor b/src/mudblazor-wasm/Layout/MainLayout.NoAuth.razor new file mode 100644 index 00000000..a3872efd --- /dev/null +++ b/src/mudblazor-wasm/Layout/MainLayout.NoAuth.razor @@ -0,0 +1,104 @@ +@inherits LayoutComponentBase + + + + + + +@*#if (SampleContent) --> + + + + Application + + + + About + + + + + + + + + @Body + + +##else + +@Body +##endif*@ + +@code { + private bool _drawerOpen = true; + private bool _isDarkMode = true; + private MudTheme? _theme; + + protected override void OnInitialized() + { + base.OnInitialized(); + + _theme = new() + { + PaletteLight = _lightPalette, + PaletteDark = _darkPalette, + LayoutProperties = new LayoutProperties() + }; + } + + private void DrawerToggle() + { + _drawerOpen = !_drawerOpen; + } + + private void DarkModeToggle() + { + _isDarkMode = !_isDarkMode; + } + + private readonly PaletteLight _lightPalette = new() + { + Black = "#110e2d", + AppbarText = "#424242", + AppbarBackground = "rgba(255,255,255,0.8)", + DrawerBackground = "#ffffff", + GrayLight = "#e8e8e8", + GrayLighter = "#f9f9f9", + }; + + private readonly PaletteDark _darkPalette = new() + { + Primary = "#7e6fff", + Surface = "#1e1e2d", + Background = "#1a1a27", + BackgroundGray = "#151521", + AppbarText = "#92929f", + AppbarBackground = "rgba(26,26,39,0.8)", + DrawerBackground = "#1a1a27", + ActionDefault = "#74718e", + ActionDisabled = "#9999994d", + ActionDisabledBackground = "#605f6d4d", + TextPrimary = "#b2b0bf", + TextSecondary = "#92929f", + TextDisabled = "#ffffff33", + DrawerIcon = "#92929f", + DrawerText = "#92929f", + GrayLight = "#2a2833", + GrayLighter = "#1e1e2d", + Info = "#4a86ff", + Success = "#3dcb6c", + Warning = "#ffb545", + Error = "#ff3f5f", + LinesDefault = "#33323e", + TableLines = "#33323e", + Divider = "#292838", + OverlayLight = "#1e1e2d80", + }; + + public string DarkLightModeButtonIcon => _isDarkMode switch + { + true => Icons.Material.Rounded.AutoMode, + false => Icons.Material.Outlined.DarkMode, + }; +} diff --git a/src/mudblazor-wasm/Layout/MainLayout.razor.css b/src/mudblazor-wasm/Layout/MainLayout.razor.css new file mode 100644 index 00000000..ecf25e5b --- /dev/null +++ b/src/mudblazor-wasm/Layout/MainLayout.razor.css @@ -0,0 +1,77 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/src/mudblazor-wasm/Layout/NavMenu.CallsWebApi.razor b/src/mudblazor-wasm/Layout/NavMenu.CallsWebApi.razor new file mode 100644 index 00000000..fd89418f --- /dev/null +++ b/src/mudblazor-wasm/Layout/NavMenu.CallsWebApi.razor @@ -0,0 +1,6 @@ + + Home + Counter + Weather + Call Web API + diff --git a/src/mudblazor-wasm/Layout/NavMenu.NoApi.razor b/src/mudblazor-wasm/Layout/NavMenu.NoApi.razor new file mode 100644 index 00000000..072d3311 --- /dev/null +++ b/src/mudblazor-wasm/Layout/NavMenu.NoApi.razor @@ -0,0 +1,5 @@ + + Home + Counter + Weather + diff --git a/src/mudblazor-wasm/Layout/NavMenu.razor.css b/src/mudblazor-wasm/Layout/NavMenu.razor.css new file mode 100644 index 00000000..617b89cc --- /dev/null +++ b/src/mudblazor-wasm/Layout/NavMenu.razor.css @@ -0,0 +1,83 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + min-height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/src/mudblazor-wasm/Layout/RedirectToLogin.razor b/src/mudblazor-wasm/Layout/RedirectToLogin.razor new file mode 100644 index 00000000..a1cf4003 --- /dev/null +++ b/src/mudblazor-wasm/Layout/RedirectToLogin.razor @@ -0,0 +1,9 @@ +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@inject NavigationManager Navigation + +@code { + protected override void OnInitialized() + { + Navigation.NavigateToLogin("authentication/login"); + } +} diff --git a/src/mudblazor-wasm/Pages/Authentication.razor b/src/mudblazor-wasm/Pages/Authentication.razor new file mode 100644 index 00000000..6c743567 --- /dev/null +++ b/src/mudblazor-wasm/Pages/Authentication.razor @@ -0,0 +1,7 @@ +@page "/authentication/{action}" +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication + + +@code{ + [Parameter] public string? Action { get; set; } +} diff --git a/src/mudblazor-wasm/Pages/CallWebApi.razor b/src/mudblazor-wasm/Pages/CallWebApi.razor new file mode 100644 index 00000000..2d9d8d54 --- /dev/null +++ b/src/mudblazor-wasm/Pages/CallWebApi.razor @@ -0,0 +1,81 @@ +@page "/callwebapi" +@using System.Net.Http.Headers +@using Microsoft.AspNetCore.Components.WebAssembly.Authentication +@inject HttpClient Http +@inject IAccessTokenProvider TokenProvider + +Call Web API + +Call Web API + + This page demonstrates requesting an access token and calling a protected web API. + + + + @_buttonText + + +@if (!string.IsNullOrWhiteSpace(_error)) +{ + @_error +} + +@if (!string.IsNullOrWhiteSpace(_responseText)) +{ + + Response + @_responseText + +} + +@code { + private bool _isLoading; + private string? _responseText; + private string? _error; + + private string _buttonText => _isLoading ? "Calling..." : "Call API"; + + private async Task CallApiAsync() + { + _isLoading = true; + _error = null; + _responseText = null; + + try + { + var scopes = "user.read" + .Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + var tokenResult = await TokenProvider.RequestAccessToken( + new AccessTokenRequestOptions + { + Scopes = scopes + }); + + if (!tokenResult.TryGetToken(out var token)) + { + _error = "Unable to acquire an access token. Sign in again and verify API scope configuration."; + return; + } + + using var request = new HttpRequestMessage(HttpMethod.Get, "[WebApiUrl]"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Value); + + using var response = await Http.SendAsync(request); + _responseText = await response.Content.ReadAsStringAsync(); + + if (!response.IsSuccessStatusCode) + { + _error = $"API returned {(int)response.StatusCode} {response.ReasonPhrase}."; + } + } + catch (Exception ex) + { + _error = ex.Message; + } + finally + { + _isLoading = false; + } + } +} diff --git a/src/mudblazor-wasm/Pages/Counter.razor b/src/mudblazor-wasm/Pages/Counter.razor new file mode 100644 index 00000000..b7be2192 --- /dev/null +++ b/src/mudblazor-wasm/Pages/Counter.razor @@ -0,0 +1,18 @@ +@page "/counter" + +Counter + +Counter + +Current count: @currentCount + +Click me + +@code { + private int currentCount = 0; + + private void IncrementCount() + { + currentCount++; + } +} diff --git a/src/mudblazor-wasm/Pages/Home.razor b/src/mudblazor-wasm/Pages/Home.razor new file mode 100644 index 00000000..96fd8067 --- /dev/null +++ b/src/mudblazor-wasm/Pages/Home.razor @@ -0,0 +1,20 @@ +@page "/" + +Home + +Hello, world! +Welcome to your new app, powered by MudBlazor and the .NET 10 Template! + +@*#if (MissingAuthority) + + Before authentication will function correctly, you must configure your provider details in Program.cs. + + +##endif*@ + + + You can find documentation and examples on our website here: + + www.mudblazor.com + + diff --git a/src/mudblazor-wasm/Pages/NotFound.razor b/src/mudblazor-wasm/Pages/NotFound.razor new file mode 100644 index 00000000..56c8cc4f --- /dev/null +++ b/src/mudblazor-wasm/Pages/NotFound.razor @@ -0,0 +1,9 @@ +@page "/not-found" +@layout MainLayout + +Not Found + +404 - Page Not Found +Sorry, the content you are looking for does not exist. + +Go to Home diff --git a/src/mudblazor-wasm/Pages/Weather.razor b/src/mudblazor-wasm/Pages/Weather.razor new file mode 100644 index 00000000..242bcf39 --- /dev/null +++ b/src/mudblazor-wasm/Pages/Weather.razor @@ -0,0 +1,52 @@ +@page "/weather" +@inject HttpClient Http + +Weather + +Weather forecast +This component demonstrates fetching data from the server. + +@if (forecasts == null) +{ + +} +else +{ + + + Date + Temp. (C) + Temp. (F) + Summary + + + @context.Date + @context.TemperatureC + @context.TemperatureF + @context.Summary + + + + + +} + +@code { + private WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + forecasts = await Http.GetFromJsonAsync("sample-data/weather.json"); + } + + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public string? Summary { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } +} diff --git a/src/mudblazor-wasm/Program.Main.cs b/src/mudblazor-wasm/Program.Main.cs new file mode 100644 index 00000000..503a3c14 --- /dev/null +++ b/src/mudblazor-wasm/Program.Main.cs @@ -0,0 +1,45 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using MudBlazor.Services; + +namespace ComponentsWebAssembly_CSharp; + +public class Program +{ + public static async Task Main(string[] args) + { + var builder = WebAssemblyHostBuilder.CreateDefault(args); + builder.RootComponents.Add("#app"); + builder.RootComponents.Add("head::after"); + + builder.Services.AddMudServices(); + builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + #if(!NoAuth) + + #endif + #if (IndividualLocalAuth) + builder.Services.AddOidcAuthentication(options => + { + #if(MissingAuthority) + // Configure your authentication provider options here. + // For more information, see https://aka.ms/blazor-standalone-auth + #endif + builder.Configuration.Bind("Local", options.ProviderOptions); + }); + #endif + #if (IndividualB2CAuth) + builder.Services.AddMsalAuthentication(options => + { + builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication); + }); + #endif + #if(OrganizationalAuth) + builder.Services.AddMsalAuthentication(options => + { + builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); + }); + #endif + + await builder.Build().RunAsync(); + } +} diff --git a/src/mudblazor-wasm/Program.cs b/src/mudblazor-wasm/Program.cs new file mode 100644 index 00000000..b2a2c913 --- /dev/null +++ b/src/mudblazor-wasm/Program.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using ComponentsWebAssembly_CSharp; +using MudBlazor.Services; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddMudServices(); +builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); +#if(!NoAuth) + +#endif +#if (IndividualLocalAuth) +builder.Services.AddOidcAuthentication(options => +{ + #if(MissingAuthority) + // Configure your authentication provider options here. + // For more information, see https://aka.ms/blazor-standalone-auth + #endif + builder.Configuration.Bind("Local", options.ProviderOptions); +}); +#endif +#if (IndividualB2CAuth) +builder.Services.AddMsalAuthentication(options => +{ + builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication); +}); +#endif +#if(OrganizationalAuth) +builder.Services.AddMsalAuthentication(options => +{ + builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); +}); +#endif + +await builder.Build().RunAsync(); diff --git a/src/mudblazor-wasm/Properties/launchSettings.json b/src/mudblazor-wasm/Properties/launchSettings.json new file mode 100644 index 00000000..167c237f --- /dev/null +++ b/src/mudblazor-wasm/Properties/launchSettings.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + //#if (HasHttpProfile) + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + //#if (HasHttpsProfile) + }, + //#else + } + //#endif + //#endif + //#if (HasHttpsProfile) + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + //#endif + } +} diff --git a/src/mudblazor-wasm/_Imports.razor b/src/mudblazor-wasm/_Imports.razor new file mode 100644 index 00000000..67202568 --- /dev/null +++ b/src/mudblazor-wasm/_Imports.razor @@ -0,0 +1,14 @@ +@using System.Net.Http +@using System.Net.Http.Json +@*#if (!NoAuth) +@using Microsoft.AspNetCore.Components.Authorization +#endif*@ +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using ComponentsWebAssembly_CSharp +@using ComponentsWebAssembly_CSharp.Layout +@using MudBlazor diff --git a/src/mudblazor-wasm/wwwroot/appsettings.Development.json b/src/mudblazor-wasm/wwwroot/appsettings.Development.json new file mode 100644 index 00000000..daafa127 --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + ////#if (IndividualLocalAuth) + //"Local": { + // "Authority": "https:////login.microsoftonline.com/", + // "ClientId": "33333333-3333-3333-33333333333333333" + //} + ////#endif +} diff --git a/src/mudblazor-wasm/wwwroot/appsettings.json b/src/mudblazor-wasm/wwwroot/appsettings.json new file mode 100644 index 00000000..e485918e --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/appsettings.json @@ -0,0 +1,27 @@ +{ + ////#if (IndividualLocalAuth) + //"Local": { + // "Authority": "https:////login.microsoftonline.com/", + // "ClientId": "33333333-3333-3333-33333333333333333" + //} + ////#endif + ////#if (IndividualB2CAuth) + //"AzureAdB2C": { + // "Authority": "https:////aadB2CInstance.b2clogin.com/qualified.domain.name/MySignUpSignInPolicyId", + // "ClientId": "33333333-3333-3333-33333333333333333", + // "ValidateAuthority": false + //} + ////#endif + ////#if (OrganizationalAuth) + ///* + The following identity settings need to be configured + before the project can be successfully executed. + For more info see https:////aka.ms/dotnet-template-ms-identity-platform + //*/ + //"AzureAd": { + // "Authority": "https:////login.microsoftonline.com/22222222-2222-2222-2222-222222222222", + // "ClientId": "33333333-3333-3333-33333333333333333", + // "ValidateAuthority": true + //} + ////#endif +} diff --git a/src/mudblazor-wasm/wwwroot/css/app.css b/src/mudblazor-wasm/wwwroot/css/app.css new file mode 100644 index 00000000..2f69a7a3 --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/css/app.css @@ -0,0 +1,112 @@ +/*#if (SampleContent)*/ +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +/*#endif*/ + +#blazor-error-ui { + color-scheme: light; + background: rgba(30, 30, 45, 0.95); + color: #f5f5f7; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 12px; + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35); + backdrop-filter: blur(6px); + box-sizing: border-box; + display: none; + left: 50%; + right: auto; + bottom: 1rem; + width: min(52rem, calc(100vw - 2rem)); + transform: translateX(-50%); + padding: 0.85rem 4rem 0.85rem 1rem; + position: fixed; + z-index: 2000; +} + +#blazor-error-ui .reload { + color: #7e6fff; + font-weight: 600; + margin-left: 0.5rem; + text-decoration: none; +} + +#blazor-error-ui .reload:hover { + text-decoration: underline; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 1rem; + top: 0.55rem; + width: 1.75rem; + height: 1.75rem; + line-height: 1.65rem; + text-align: center; + border-radius: 999px; + color: #d7d7df; + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(255, 255, 255, 0.08); + } + + #blazor-error-ui .dismiss:hover { + background: rgba(255, 255, 255, 0.12); + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: absolute; + display: block; + width: 8rem; + height: 8rem; + inset: 20vh 0 auto 0; + margin: 0 auto 0 auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} + +.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder { + color: var(--bs-secondary-color); + text-align: end; +} + +.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder { + text-align: start; +} diff --git a/src/mudblazor-wasm/wwwroot/favicon.ico b/src/mudblazor-wasm/wwwroot/favicon.ico new file mode 100644 index 00000000..12392236 Binary files /dev/null and b/src/mudblazor-wasm/wwwroot/favicon.ico differ diff --git a/src/mudblazor-wasm/wwwroot/favicon.png b/src/mudblazor-wasm/wwwroot/favicon.png new file mode 100644 index 00000000..8422b596 Binary files /dev/null and b/src/mudblazor-wasm/wwwroot/favicon.png differ diff --git a/src/mudblazor-wasm/wwwroot/icon-192.png b/src/mudblazor-wasm/wwwroot/icon-192.png new file mode 100644 index 00000000..166f56da Binary files /dev/null and b/src/mudblazor-wasm/wwwroot/icon-192.png differ diff --git a/src/mudblazor-wasm/wwwroot/icon-512.png b/src/mudblazor-wasm/wwwroot/icon-512.png new file mode 100644 index 00000000..c2dd4842 Binary files /dev/null and b/src/mudblazor-wasm/wwwroot/icon-512.png differ diff --git a/src/mudblazor-wasm/wwwroot/index.html b/src/mudblazor-wasm/wwwroot/index.html new file mode 100644 index 00000000..f54f4fb4 --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/index.html @@ -0,0 +1,54 @@ + + + + + + + ComponentsWebAssembly-CSharp + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + + + + + diff --git a/src/mudblazor-wasm/wwwroot/manifest.webmanifest b/src/mudblazor-wasm/wwwroot/manifest.webmanifest new file mode 100644 index 00000000..dea89b5f --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/manifest.webmanifest @@ -0,0 +1,22 @@ +{ + "name": "ComponentsWebAssembly-CSharp", + "short_name": "ComponentsWebAssembly-CSharp", + "id": "./", + "start_url": "./", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#03173d", + "prefer_related_applications": false, + "icons": [ + { + "src": "icon-512.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "icon-192.png", + "type": "image/png", + "sizes": "192x192" + } + ] +} diff --git a/src/mudblazor-wasm/wwwroot/sample-data/weather.json b/src/mudblazor-wasm/wwwroot/sample-data/weather.json new file mode 100644 index 00000000..b7459733 --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/sample-data/weather.json @@ -0,0 +1,27 @@ +[ + { + "date": "2022-01-06", + "temperatureC": 1, + "summary": "Freezing" + }, + { + "date": "2022-01-07", + "temperatureC": 14, + "summary": "Bracing" + }, + { + "date": "2022-01-08", + "temperatureC": -13, + "summary": "Freezing" + }, + { + "date": "2022-01-09", + "temperatureC": -16, + "summary": "Balmy" + }, + { + "date": "2022-01-10", + "temperatureC": -2, + "summary": "Chilly" + } +] diff --git a/src/mudblazor-wasm/wwwroot/service-worker.js b/src/mudblazor-wasm/wwwroot/service-worker.js new file mode 100644 index 00000000..fe614dae --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/service-worker.js @@ -0,0 +1,4 @@ +// In development, always fetch from the network and do not enable offline support. +// This is because caching would make development more difficult (changes would not +// be reflected on the first load after each change). +self.addEventListener('fetch', () => { }); diff --git a/src/mudblazor-wasm/wwwroot/service-worker.published.js b/src/mudblazor-wasm/wwwroot/service-worker.published.js new file mode 100644 index 00000000..51a0e5c7 --- /dev/null +++ b/src/mudblazor-wasm/wwwroot/service-worker.published.js @@ -0,0 +1,55 @@ +// Caution! Be sure you understand the caveats before publishing an application with +// offline support. See https://aka.ms/blazor-offline-considerations + +self.importScripts('./service-worker-assets.js'); +self.addEventListener('install', event => event.waitUntil(onInstall(event))); +self.addEventListener('activate', event => event.waitUntil(onActivate(event))); +self.addEventListener('fetch', event => event.respondWith(onFetch(event))); + +const cacheNamePrefix = 'offline-cache-'; +const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`; +const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/, /\.webmanifest$/ ]; +const offlineAssetsExclude = [ /^service-worker\.js$/ ]; + +// Replace with your base path if you are hosting on a subfolder. Ensure there is a trailing '/'. +const base = "/"; +const baseUrl = new URL(base, self.origin); +const manifestUrlList = self.assetsManifest.assets.map(asset => new URL(asset.url, baseUrl).href); + +async function onInstall(event) { + console.info('Service worker: Install'); + + // Fetch and cache all matching items from the assets manifest + const assetsRequests = self.assetsManifest.assets + .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url))) + .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url))) + .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' })); + await caches.open(cacheName).then(cache => cache.addAll(assetsRequests)); +} + +async function onActivate(event) { + console.info('Service worker: Activate'); + + // Delete unused caches + const cacheKeys = await caches.keys(); + await Promise.all(cacheKeys + .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName) + .map(key => caches.delete(key))); +} + +async function onFetch(event) { + let cachedResponse = null; + if (event.request.method === 'GET') { + // For all navigation requests, try to serve index.html from cache, + // unless that request is for an offline resource. + // If you need some URLs to be server-rendered, edit the following check to exclude those URLs + const shouldServeIndexHtml = event.request.mode === 'navigate' + && !manifestUrlList.some(url => url === event.request.url); + + const request = shouldServeIndexHtml ? 'index.html' : event.request; + const cache = await caches.open(cacheName); + cachedResponse = await cache.match(request); + } + + return cachedResponse || fetch(event.request); +}