diff --git a/build/pipelines/azure-pipelines.loc.yaml b/build/pipelines/azure-pipelines.loc.yaml index 880c9b6b..bfd7924f 100644 --- a/build/pipelines/azure-pipelines.loc.yaml +++ b/build/pipelines/azure-pipelines.loc.yaml @@ -27,12 +27,14 @@ jobs: variables: skipComponentGovernanceDetection: true steps: - - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@1 + - checkout: self + clean: true + + - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@2 displayName: Send resources to Touchdown Build inputs: teamId: 86 - authId: bf6d44ca-3210-4cfa-833f-c79f164ea27b - authKey: $(LocServiceKey) + TDBuildServiceConnection: EE-TDBuild-Localization isPreview: false relativePathRoot: src/Calculator/Resources/en-US/ resourceFilePath: '*.resw' diff --git a/build/pipelines/azure-pipelines.release.yaml b/build/pipelines/azure-pipelines.release.yaml index b1627bb3..4c8a3f11 100644 --- a/build/pipelines/azure-pipelines.release.yaml +++ b/build/pipelines/azure-pipelines.release.yaml @@ -9,7 +9,7 @@ pr: none variables: versionMajor: 11 - versionMinor: 2311 + versionMinor: 2404 versionBuild: $[counter(format('{0}.{1}.*', variables['versionMajor'], variables['versionMinor']), 0)] versionPatch: 0 diff --git a/build/pipelines/templates/build-single-architecture.yaml b/build/pipelines/templates/build-single-architecture.yaml index e425000a..b2436f1b 100644 --- a/build/pipelines/templates/build-single-architecture.yaml +++ b/build/pipelines/templates/build-single-architecture.yaml @@ -55,7 +55,7 @@ jobs: downloadDirectory: $(Build.SourcesDirectory) vstsFeed: WindowsInboxApps vstsFeedPackage: calculator-internals - vstsPackageVersion: 0.0.105 + vstsPackageVersion: 0.0.106 - task: NuGetToolInstaller@1 displayName: Use NuGet 6.x diff --git a/build/pipelines/templates/package-msixbundle.yaml b/build/pipelines/templates/package-msixbundle.yaml index 4bc2fe30..76d3b169 100644 --- a/build/pipelines/templates/package-msixbundle.yaml +++ b/build/pipelines/templates/package-msixbundle.yaml @@ -91,7 +91,7 @@ jobs: downloadDirectory: $(Build.SourcesDirectory) vstsFeed: WindowsInboxApps vstsFeedPackage: calculator-internals - vstsPackageVersion: 0.0.105 + vstsPackageVersion: 0.0.106 - task: PowerShell@2 displayName: Generate MsixBundle mapping diff --git a/build/pipelines/templates/release-vpack.yaml b/build/pipelines/templates/release-vpack.yaml index d5ed3b83..75fa4c21 100644 --- a/build/pipelines/templates/release-vpack.yaml +++ b/build/pipelines/templates/release-vpack.yaml @@ -28,6 +28,23 @@ jobs: contents: Microsoft.WindowsCalculator_8wekyb3d8bbwe.msixbundle targetFolder: $(Pipeline.Workspace)\vpack\msixBundle + - task: UniversalPackages@0 + displayName: Download internals package + inputs: + command: download + downloadDirectory: $(Build.SourcesDirectory) + vstsFeed: WindowsInboxApps + vstsFeedPackage: calculator-internals + vstsPackageVersion: 0.0.106 + + - pwsh: | + $configPath = "$(Build.SourcesDirectory)\Tools\Build\Signing\ESRP-auth.json" + $auth = Get-Content -Raw $configPath | ConvertFrom-Json + $sbomKeyCode = $auth._ExtraContext.SbomKeyCode + echo $sbomKeyCode + echo "##vso[task.setvariable variable=SbomKeyCode]$sbomKeyCode" + displayName: Get SBOM Key Code + - task: PkgESVPack@12 displayName: Create and push vpack for app env: @@ -39,3 +56,8 @@ jobs: version: $(versionMajor).$(versionMinor).$(versionBuild) owner: paxeeapps provData: true + taskLogVerbosity: Diagnostic + coseUsageScenario: 'product' + signSbom: true + sbomKeyCode: $(SbomKeyCode) + pathToEsrpAuthJson: '$(Build.SourcesDirectory)\Tools\Build\Signing\ESRP-auth.json' diff --git a/src/CalcViewModel/Common/NavCategory.cpp b/src/CalcViewModel/Common/NavCategory.cpp index 829f7488..c8e5185e 100644 --- a/src/CalcViewModel/Common/NavCategory.cpp +++ b/src/CalcViewModel/Common/NavCategory.cpp @@ -50,34 +50,19 @@ static constexpr int GRAPHING_ID = 17; namespace // put the utils within this TU { Platform::String^ CurrentUserId; - std::mutex GraphingModeCheckMutex; bool IsGraphingModeEnabled() { - static bool isChecked = false; - static bool isEnabled = false; - - std::scoped_lock lock(GraphingModeCheckMutex); - if (isChecked) - { - return isEnabled; - } - else + static auto enabled = [] { auto user = User::GetFromId(CurrentUserId); if (user == nullptr) { return true; } - - auto namedPolicyData = NamedPolicy::GetPolicyFromPathForUser( - user, - L"Education", - L"AllowGraphingCalculator"); - isEnabled = namedPolicyData->GetBoolean(); - isChecked = true; - return isEnabled; - } + return NamedPolicy::GetPolicyFromPathForUser(user, L"Education", L"AllowGraphingCalculator")->GetBoolean(); + }(); + return enabled; } // The order of items in this list determines the order of items in the menu. @@ -318,7 +303,6 @@ NavCategoryGroup::NavCategoryGroup(const NavCategoryGroupInitializer& groupIniti void NavCategoryStates::SetCurrentUser(Platform::String^ userId) { - std::scoped_lock lock(GraphingModeCheckMutex); CurrentUserId = userId; } @@ -518,13 +502,6 @@ bool NavCategoryStates::IsValidViewMode(ViewMode mode) bool NavCategoryStates::IsViewModeEnabled(ViewMode mode) { - if (mode != ViewMode::Graphing) - { - return true; - } - else - { - return IsGraphingModeEnabled(); - } + return mode != ViewMode::Graphing ? true : IsGraphingModeEnabled(); } diff --git a/src/Calculator/App.xaml b/src/Calculator/App.xaml index e2a61fc1..c490d6e6 100644 --- a/src/Calculator/App.xaml +++ b/src/Calculator/App.xaml @@ -958,7 +958,7 @@ - + diff --git a/src/Calculator/App.xaml.cs b/src/Calculator/App.xaml.cs index 84d75e10..8ca14222 100644 --- a/src/Calculator/App.xaml.cs +++ b/src/Calculator/App.xaml.cs @@ -6,37 +6,24 @@ // Declaration of the App class. // -using CalculatorApp.ViewModel.Common; -using CalculatorApp.ViewModel.Common.Automation; - using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Threading; using System.Threading.Tasks; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; -using Windows.ApplicationModel.Core; -using Windows.Foundation; using Windows.Storage; -using Windows.UI.Core; using Windows.UI.StartScreen; using Windows.UI.ViewManagement; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using CalculatorApp.Utils; +using CalculatorApp.ViewModel.Common; +using CalculatorApp.ViewModel.Common.Automation; + namespace CalculatorApp { - namespace ApplicationResourceKeys - { - public static class Globals - { - public static readonly string AppMinWindowHeight = "AppMinWindowHeight"; - public static readonly string AppMinWindowWidth = "AppMinWindowWidth"; - } - } - /// /// Provides application-specific behavior to supplement the default Application class. /// @@ -49,17 +36,12 @@ namespace CalculatorApp public App() { InitializeComponent(); - - m_preLaunched = false; - - RegisterDependencyProperties(); + NarratorNotifier.RegisterDependencyProperties(); // TODO: MSFT 14645325: Set this directly from XAML. // Currently this is bugged so the property is only respected from code-behind. HighContrastAdjustment = ApplicationHighContrastAdjustment.None; - Suspending += OnSuspending; - #if DEBUG DebugSettings.IsBindingTracingEnabled = true; DebugSettings.BindingFailed += (sender, args) => @@ -81,18 +63,12 @@ namespace CalculatorApp /// Details about the launch request and process. protected override void OnLaunched(LaunchActivatedEventArgs args) { - if (args.PrelaunchActivated) - { - // If the app got pre-launch activated, then save that state in a flag - m_preLaunched = true; - } - NavCategoryStates.SetCurrentUser(args.User.NonRoamableId); - // It takes time to check GraphingMode at the 1st time. So, do it in a background thread + // It takes time to check GraphingMode at the very first time. Warm up in a background thread. Task.Run(() => NavCategoryStates.IsViewModeEnabled(ViewMode.Graphing)); - OnAppLaunch(args, args.Arguments); + OnAppLaunch(args, args.Arguments, args.PrelaunchActivated); } protected override void OnActivated(IActivatedEventArgs args) @@ -101,76 +77,36 @@ namespace CalculatorApp { // We currently don't pass the uri as an argument, // and handle any protocol launch as a normal app launch. - OnAppLaunch(args, null); + OnAppLaunch(args, null, false); } } - internal void RemoveWindow(WindowFrameService frameService) - { - // Shell does not allow killing the main window. - if (m_mainViewId != frameService.GetViewId()) - { - _ = HandleViewReleaseAndRemoveWindowFromMap(frameService); - } - } - - internal void RemoveSecondaryWindow(WindowFrameService frameService) - { - // Shell does not allow killing the main window. - if (m_mainViewId != frameService.GetViewId()) - { - RemoveWindowFromMap(frameService.GetViewId()); - } - } - - private static Frame CreateFrame() - { - var frame = new Frame - { - FlowDirection = LocalizationService.GetInstance().GetFlowDirection() - }; - return frame; - } - - private static void SetMinWindowSizeAndThemeAndActivate(Frame rootFrame, Size minWindowSize) - { - // SetPreferredMinSize should always be called before Window.Activate - ApplicationView appView = ApplicationView.GetForCurrentView(); - appView.SetPreferredMinSize(minWindowSize); - - // Place the frame in the current Window - Window.Current.Content = rootFrame; - CalculatorApp.Utils.ThemeHelper.InitializeAppTheme(); - Window.Current.Activate(); - } - - private void OnAppLaunch(IActivatedEventArgs args, string argument) + private void OnAppLaunch(IActivatedEventArgs args, string argument, bool isPreLaunch) { // Uncomment the following lines to display frame-rate and per-frame CPU usage info. - //#if _DEBUG + //#if DEBUG // if (IsDebuggerPresent()) // { - // DebugSettings->EnableFrameRateCounter = true; + // DebugSettings.EnableFrameRateCounter = true; // } //#endif - args.SplashScreen.Dismissed += DismissedEventHandler; + args.SplashScreen.Dismissed += async (_, __) => await SetupJumpListAsync(); - var rootFrame = (Window.Current.Content as Frame); - WeakReference weak = new WeakReference(this); + var minWindowWidth = Convert.ToSingle(Resources["AppMinWindowWidth"]); + var minWindowHeight = Convert.ToSingle(Resources["AppMinWindowHeight"]); + var minWindowSize = SizeHelper.FromDimensions(minWindowWidth, minWindowHeight); + var appView = ApplicationView.GetForCurrentView(); + var localSettings = ApplicationData.Current.LocalSettings; - float minWindowWidth = (float)((double)Resources[ApplicationResourceKeys.Globals.AppMinWindowWidth]); - float minWindowHeight = (float)((double)Resources[ApplicationResourceKeys.Globals.AppMinWindowHeight]); - Size minWindowSize = SizeHelper.FromDimensions(minWindowWidth, minWindowHeight); + // SetPreferredMinSize should always be called before Window.Activate + appView.SetPreferredMinSize(minWindowSize); - ApplicationView appView = ApplicationView.GetForCurrentView(); - ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; // For very first launch, set the size of the calc as size of the default standard mode if (!localSettings.Values.ContainsKey("VeryFirstLaunch")) { localSettings.Values["VeryFirstLaunch"] = false; - appView.SetPreferredMinSize(minWindowSize); - appView.TryResizeView(minWindowSize); + appView.TryResizeView(minWindowSize); // the requested size must not be less than the min size. } else { @@ -179,190 +115,34 @@ namespace CalculatorApp // Do not repeat app initialization when the Window already has content, // just ensure that the window is active + var rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { - if (!Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) // PC Family + rootFrame = new Frame { - // Disable the system view activation policy during the first launch of the app - // only for PC family devices and not for phone family devices - try - { - ApplicationViewSwitcher.DisableSystemViewActivationPolicy(); - } - catch (Exception) - { - // Log that DisableSystemViewActionPolicy didn't work - } - } - - // Create a Frame to act as the navigation context - rootFrame = App.CreateFrame(); - - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - if (!rootFrame.Navigate(typeof(MainPage), argument)) - { - // We couldn't navigate to the main page, kill the app so we have a good - // stack to debug - throw new SystemException(); - } - - SetMinWindowSizeAndThemeAndActivate(rootFrame, minWindowSize); - m_mainViewId = ApplicationView.GetForCurrentView().Id; - AddWindowToMap(WindowFrameService.CreateNewWindowFrameService(rootFrame, false, weak)); + FlowDirection = LocalizationService.GetInstance().GetFlowDirection() + }; } - else + + if (isPreLaunch) { - // For first launch, LaunchStart is logged in constructor, this is for subsequent launches. - - // !Phone check is required because even in continuum mode user interaction mode is Mouse not Touch - if ((UIViewSettings.GetForCurrentView().UserInteractionMode == UserInteractionMode.Mouse) - && (!Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))) - { - // If the pre-launch hasn't happened then allow for the new window/view creation - if (!m_preLaunched) - { - var newCoreAppView = CoreApplication.CreateNewView(); - _ = newCoreAppView.Dispatcher.RunAsync( - CoreDispatcherPriority.Normal, async () => - { - if (weak.Target is App that) - { - var newRootFrame = App.CreateFrame(); - - SetMinWindowSizeAndThemeAndActivate(newRootFrame, minWindowSize); - - if (!newRootFrame.Navigate(typeof(MainPage), argument)) - { - // We couldn't navigate to the main page, kill the app so we have a good - // stack to debug - throw new SystemException(); - } - - var frameService = WindowFrameService.CreateNewWindowFrameService(newRootFrame, true, weak); - that.AddWindowToMap(frameService); - - var dispatcher = CoreWindow.GetForCurrentThread().Dispatcher; - - // CSHARP_MIGRATION_ANNOTATION: - // class SafeFrameWindowCreation is being interpreted into a IDisposable class - // in order to enhance its RAII capability that was written in C++/CX - using (var safeFrameServiceCreation = new SafeFrameWindowCreation(frameService, that)) - { - int newWindowId = ApplicationView.GetApplicationViewIdForWindow(CoreWindow.GetForCurrentThread()); - - ActivationViewSwitcher activationViewSwitcher = null; - var activateEventArgs = (args as IViewSwitcherProvider); - if (activateEventArgs != null) - { - activationViewSwitcher = activateEventArgs.ViewSwitcher; - } - - if (activationViewSwitcher != null) - { - _ = activationViewSwitcher.ShowAsStandaloneAsync(newWindowId, ViewSizePreference.Default); - safeFrameServiceCreation.SetOperationSuccess(true); - } - else - { - var activatedEventArgs = (args as IApplicationViewActivatedEventArgs); - if ((activatedEventArgs != null) && (activatedEventArgs.CurrentlyShownApplicationViewId != 0)) - { - // CSHARP_MIGRATION_ANNOTATION: - // here we don't use ContinueWith() to interpret origin code because we would like to - // pursue the design of class SafeFrameWindowCreate whichi was using RAII to ensure - // some states get handled properly when its instance is being destructed. - // - // To achieve that, SafeFrameWindowCreate has been reinterpreted using IDisposable - // pattern, which forces we use below way to keep async works being controlled within - // a same code block. - var viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync( - frameService.GetViewId(), - ViewSizePreference.Default, - activatedEventArgs.CurrentlyShownApplicationViewId, - ViewSizePreference.Default); - // SafeFrameServiceCreation is used to automatically remove the frame - // from the list of frames if something goes bad. - safeFrameServiceCreation.SetOperationSuccess(viewShown); - } - } - } - } - }); - } - else - { - ActivationViewSwitcher activationViewSwitcher = null; - var activateEventArgs = (args as IViewSwitcherProvider); - if (activateEventArgs != null) - { - activationViewSwitcher = activateEventArgs.ViewSwitcher; - } - - if (activationViewSwitcher != null) - { - _ = activationViewSwitcher.ShowAsStandaloneAsync( - ApplicationView.GetApplicationViewIdForWindow(CoreWindow.GetForCurrentThread()), ViewSizePreference.Default); - } - else - { - TraceLogger.GetInstance().LogError(ViewMode.None, "App.OnAppLaunch", "Null_ActivationViewSwitcher"); - } - } - // Set the preLaunched flag to false - m_preLaunched = false; - } - else // for touch devices - { - if (rootFrame.Content == null) - { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - if (!rootFrame.Navigate(typeof(MainPage), argument)) - { - // We couldn't navigate to the main page, - // kill the app so we have a good stack to debug - throw new SystemException(); - } - } - if (ApplicationView.GetForCurrentView().ViewMode != ApplicationViewMode.CompactOverlay) - { - if (!Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) - { - // for tablet mode: since system view activation policy is disabled so do ShowAsStandaloneAsync if activationViewSwitcher exists in - // activationArgs - ActivationViewSwitcher activationViewSwitcher = null; - var activateEventArgs = (args as IViewSwitcherProvider); - if (activateEventArgs != null) - { - activationViewSwitcher = activateEventArgs.ViewSwitcher; - } - if (activationViewSwitcher != null) - { - var viewId = (args as IApplicationViewActivatedEventArgs).CurrentlyShownApplicationViewId; - if (viewId != 0) - { - _ = activationViewSwitcher.ShowAsStandaloneAsync(viewId); - } - } - } - // Ensure the current window is active - Window.Current.Activate(); - } - } + return; } - } - private void DismissedEventHandler(SplashScreen sender, object e) - { - _ = SetupJumpList(); - } + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + if (rootFrame.Content == null && !rootFrame.Navigate(typeof(MainPage), argument)) + { + // We couldn't navigate to the main page, kill the app so we have a good + // stack to debug + throw new SystemException("6d430286-eb5d-4f8d-95d2-3d1059552968"); + } - private void RegisterDependencyProperties() - { - NarratorNotifier.RegisterDependencyProperties(); + // Place the frame in the current Window + Window.Current.Content = rootFrame; + ThemeHelper.InitializeAppTheme(); + Window.Current.Activate(); } private void OnSuspending(object sender, SuspendingEventArgs args) @@ -370,43 +150,7 @@ namespace CalculatorApp TraceLogger.GetInstance().LogButtonUsage(); } - private sealed class SafeFrameWindowCreation : IDisposable - { - public SafeFrameWindowCreation(WindowFrameService frameService, App parent) - { - m_frameService = frameService; - m_frameOpenedInWindow = false; - m_parent = parent; - } - - public void SetOperationSuccess(bool success) - { - m_frameOpenedInWindow = success; - } - - public void Dispose() - { - if (!m_frameOpenedInWindow) - { - // Close the window as the navigation to the window didn't succeed - // and this is not visible to the user. - m_parent.RemoveWindowFromMap(m_frameService.GetViewId()); - } - - GC.SuppressFinalize(this); - } - - ~SafeFrameWindowCreation() - { - Dispose(); - } - - private readonly WindowFrameService m_frameService; - private bool m_frameOpenedInWindow; - private readonly App m_parent; - }; - - private async Task SetupJumpList() + private async Task SetupJumpListAsync() { try { @@ -426,87 +170,19 @@ namespace CalculatorApp var item = JumpListItem.CreateWithArguments(((int)mode).ToString(), "ms-resource:///Resources/" + NavCategoryStates.GetNameResourceKey(mode)); item.Description = "ms-resource:///Resources/" + NavCategoryStates.GetNameResourceKey(mode); item.Logo = new Uri("ms-appx:///Assets/" + mode + ".png"); - jumpList.Items.Add(item); } await jumpList.SaveAsync(); } - catch + catch (Exception ex) { + TraceLogger.GetInstance().LogError(ViewMode.None, nameof(SetupJumpListAsync), ex.ToString()); +#if DEBUG + throw; +#endif } } - - private async Task HandleViewReleaseAndRemoveWindowFromMap(WindowFrameService frameService) - { - WeakReference weak = new WeakReference(this); - - // Unregister the event handler of the Main Page - var frame = (Window.Current.Content as Frame); - var mainPage = (frame.Content as MainPage); - - mainPage.UnregisterEventHandlers(); - - await frameService.HandleViewRelease(); - await Task.Run(() => - { - var that = weak.Target as App; - that.RemoveWindowFromMap(frameService.GetViewId()); - }).ConfigureAwait(false /* task_continuation_context::use_arbitrary() */); - } - - private void AddWindowToMap(WindowFrameService frameService) - { - m_windowsMapLock.EnterWriteLock(); - try - { - m_secondaryWindows[frameService.GetViewId()] = frameService; - TraceLogger.GetInstance().UpdateWindowCount(Convert.ToUInt64(m_secondaryWindows.Count)); - } - finally - { - m_windowsMapLock.ExitWriteLock(); - } - } - - private WindowFrameService GetWindowFromMap(int viewId) - { - m_windowsMapLock.EnterReadLock(); - try - { - if (m_secondaryWindows.TryGetValue(viewId, out var windowMapEntry)) - { - return windowMapEntry; - } - else - { - return null; - } - } - finally - { - m_windowsMapLock.ExitReadLock(); - } - } - - private void RemoveWindowFromMap(int viewId) - { - m_windowsMapLock.EnterWriteLock(); - try - { - bool removed = m_secondaryWindows.Remove(viewId); - Debug.Assert(removed != false, "Window does not exist in the list"); - } - finally - { - m_windowsMapLock.ExitWriteLock(); - } - } - - private readonly ReaderWriterLockSlim m_windowsMapLock = new ReaderWriterLockSlim(); - private readonly Dictionary m_secondaryWindows = new Dictionary(); - private int m_mainViewId; - private bool m_preLaunched; } } diff --git a/src/Calculator/Calculator.csproj b/src/Calculator/Calculator.csproj index e9f71be3..b92f52fd 100644 --- a/src/Calculator/Calculator.csproj +++ b/src/Calculator/Calculator.csproj @@ -250,7 +250,6 @@ UnitConverter.xaml - diff --git a/src/Calculator/Package.Release.appxmanifest b/src/Calculator/Package.Release.appxmanifest index c71a8cbe..57f7e108 100644 --- a/src/Calculator/Package.Release.appxmanifest +++ b/src/Calculator/Package.Release.appxmanifest @@ -1,5 +1,12 @@ - + @@ -14,7 +21,11 @@ - + diff --git a/src/Calculator/Package.appxmanifest b/src/Calculator/Package.appxmanifest index 515c8ee9..901b0453 100644 --- a/src/Calculator/Package.appxmanifest +++ b/src/Calculator/Package.appxmanifest @@ -1,5 +1,12 @@ - + @@ -14,7 +21,11 @@ - + diff --git a/src/Calculator/Resources/af-ZA/Resources.resw b/src/Calculator/Resources/af-ZA/Resources.resw index 470ece3f..9b2394d0 100644 --- a/src/Calculator/Resources/af-ZA/Resources.resw +++ b/src/Calculator/Resources/af-ZA/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Daar is nog geen geskiedenis nie + Daar is nog geen geskiedenis nie. The text that shows as the header for the history list - Daar is niks in geheue gestoor nie + Daar is niks in geheue gestoor nie. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Instellingsbladsy Announcement used when Settings page is opened + + Maak die kontekskieslys oop vir beskikbare aksies + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/am-ET/Resources.resw b/src/Calculator/Resources/am-ET/Resources.resw index 5e5bf5da..4ee79c2f 100644 --- a/src/Calculator/Resources/am-ET/Resources.resw +++ b/src/Calculator/Resources/am-ET/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - እስካሁን ምንም ታሪክ የለም + እስካሁን ምንም ታሪክ የለም። The text that shows as the header for the history list - በማኅደረ ትውስታ ውስጥ የተቀመጠ ምንም ነገር የለም + በማህደረ ትውስታ ውስጥ የተቀመጠ ምንም ነገር የለም። The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ የክንውን አውዶች ገጽ Announcement used when Settings page is opened + + ላሉት ድርጊቶች የአውድ ምናሌውን ይክፈቱ + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ar-SA/Resources.resw b/src/Calculator/Resources/ar-SA/Resources.resw index 0e918ff4..9b1f90d1 100644 --- a/src/Calculator/Resources/ar-SA/Resources.resw +++ b/src/Calculator/Resources/ar-SA/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - لا توجد محفوظات بعد + لا توجد محفوظات بعد. The text that shows as the header for the history list - لا يوجد شيء محفوظ في الذاكرة + لا يوجد شيء محفوظ في الذاكرة. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ صفحة الإعدادات Announcement used when Settings page is opened + + فتح قائمة السياق للإجراءات المتوفرة + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/az-Latn-AZ/Resources.resw b/src/Calculator/Resources/az-Latn-AZ/Resources.resw index 1ba2e6da..73eae51c 100644 --- a/src/Calculator/Resources/az-Latn-AZ/Resources.resw +++ b/src/Calculator/Resources/az-Latn-AZ/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Hələlik tarixçə yoxdur + Hələlik tarixçə yoxdur. The text that shows as the header for the history list - Yaddaşda heç nə saxlanmayıb + Yaddaşda heç nə saxlanmayıb. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Parametrlər səhifəsi Announcement used when Settings page is opened + + Mövcud fəaliyyətlər üçün kontekst menyunu açın + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/bg-BG/Resources.resw b/src/Calculator/Resources/bg-BG/Resources.resw index 43d6717c..5da4a8c1 100644 --- a/src/Calculator/Resources/bg-BG/Resources.resw +++ b/src/Calculator/Resources/bg-BG/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Все още няма хронология + Все още няма хронология. The text that shows as the header for the history list - В паметта няма нищо записано + В паметта не е записано нищо. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Страница с настройки Announcement used when Settings page is opened + + Отваряне на контекстното меню за наличните действия + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ca-ES/Resources.resw b/src/Calculator/Resources/ca-ES/Resources.resw index c5d3fc0c..a13ca373 100644 --- a/src/Calculator/Resources/ca-ES/Resources.resw +++ b/src/Calculator/Resources/ca-ES/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Encara no hi ha historial + Encara no hi ha historial. The text that shows as the header for the history list - No hi ha res desat a la memòria + No hi ha res desat a la memòria. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Pàgina de configuració Announcement used when Settings page is opened + + Obriu el menú contextual per a les accions disponibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/cs-CZ/Resources.resw b/src/Calculator/Resources/cs-CZ/Resources.resw index f6fb03ac..ae86355a 100644 --- a/src/Calculator/Resources/cs-CZ/Resources.resw +++ b/src/Calculator/Resources/cs-CZ/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Zatím tu není žádná historie + Zatím tu není žádná historie. The text that shows as the header for the history list - V paměti není nic uložené + V paměti není nic uložené. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stránka Nastavení Announcement used when Settings page is opened + + Otevřete místní nabídku a podívejte se na dostupné akce + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/da-DK/Resources.resw b/src/Calculator/Resources/da-DK/Resources.resw index 37a9727a..6334af65 100644 --- a/src/Calculator/Resources/da-DK/Resources.resw +++ b/src/Calculator/Resources/da-DK/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Der er ingen oversigt endnu + Der er ingen historik endnu. The text that shows as the header for the history list - Der er ikke gemt noget i hukommelsen + Der er ikke gemt noget i hukommelsen. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Siden Indstillinger Announcement used when Settings page is opened + + Åbn genvejsmenuen for tilgængelige handlinger + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/de-DE/Resources.resw b/src/Calculator/Resources/de-DE/Resources.resw index b24e5102..a13aa100 100644 --- a/src/Calculator/Resources/de-DE/Resources.resw +++ b/src/Calculator/Resources/de-DE/Resources.resw @@ -2346,7 +2346,7 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Es ist noch kein Verlauf vorhanden + Es ist noch kein Verlauf vorhanden. The text that shows as the header for the history list @@ -4178,4 +4178,8 @@ Seite „Einstellungen“ Announcement used when Settings page is opened + + Öffnen des Kontextmenüs für verfügbare Aktionen + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/el-GR/Resources.resw b/src/Calculator/Resources/el-GR/Resources.resw index d986908e..2b3b7426 100644 --- a/src/Calculator/Resources/el-GR/Resources.resw +++ b/src/Calculator/Resources/el-GR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Δεν υπάρχει ιστορικό ακόμα + Δεν υπάρχει ιστορικό ακόμα. The text that shows as the header for the history list - Δεν υπάρχει κάτι αποθηκευμένο στη μνήμη + Δεν υπάρχει τίποτα αποθηκευμένο στη μνήμη. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Σελίδα ρυθμίσεων Announcement used when Settings page is opened + + Άνοιγμα του μενού περιβάλλοντος για διαθέσιμες ενέργειες + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/en-GB/Resources.resw b/src/Calculator/Resources/en-GB/Resources.resw index 92751816..e52851a1 100644 --- a/src/Calculator/Resources/en-GB/Resources.resw +++ b/src/Calculator/Resources/en-GB/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - There’s no history yet + There’s no history yet. The text that shows as the header for the history list - There’s nothing saved in your memory + There’s nothing saved in memory. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Settings page Announcement used when Settings page is opened + + Open the context menu for available actions + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/en-US/Resources.resw b/src/Calculator/Resources/en-US/Resources.resw index 5dbd92b0..aee01e98 100644 --- a/src/Calculator/Resources/en-US/Resources.resw +++ b/src/Calculator/Resources/en-US/Resources.resw @@ -2778,11 +2778,11 @@ {Locked}The Octal button - There’s no history yet + There’s no history yet. The text that shows as the header for the history list - There’s nothing saved in memory + There’s nothing saved in memory. The text that shows as the header for the memory list @@ -4750,4 +4750,8 @@ Settings page Announcement used when Settings page is opened + + Open the context menu for available actions + Screen reader prompt for the context menu of the expression box + diff --git a/src/Calculator/Resources/es-ES/Resources.resw b/src/Calculator/Resources/es-ES/Resources.resw index 31008739..1fa956b7 100644 --- a/src/Calculator/Resources/es-ES/Resources.resw +++ b/src/Calculator/Resources/es-ES/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - No hay historial todavía + No hay historial todavía. The text that shows as the header for the history list - No hay nada guardado en la memoria + No hay nada guardado en la memoria. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Página de configuración Announcement used when Settings page is opened + + Abrir el menú contextual para ver las acciones disponibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/es-MX/Resources.resw b/src/Calculator/Resources/es-MX/Resources.resw index 50fdcf0f..50266e56 100644 --- a/src/Calculator/Resources/es-MX/Resources.resw +++ b/src/Calculator/Resources/es-MX/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Aún no hay historial + No hay historial todavía. The text that shows as the header for the history list - No hay nada guardado en la memoria + No hay nada guardado en la memoria. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Página de configuración Announcement used when Settings page is opened + + Abrir el menú contextual para ver las acciones disponibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/et-EE/Resources.resw b/src/Calculator/Resources/et-EE/Resources.resw index 86de9bfc..119ef26e 100644 --- a/src/Calculator/Resources/et-EE/Resources.resw +++ b/src/Calculator/Resources/et-EE/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Ajalugu pole veel + Ajalugu pole veel. The text that shows as the header for the history list - Mällu pole midagi salvestatud + Mällu pole midagi salvestatud. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Sätete leht Announcement used when Settings page is opened + + Saadaolevate toimingute kontekstimenüü avamine. + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/eu-ES/Resources.resw b/src/Calculator/Resources/eu-ES/Resources.resw index 763bd136..e11ce605 100644 --- a/src/Calculator/Resources/eu-ES/Resources.resw +++ b/src/Calculator/Resources/eu-ES/Resources.resw @@ -2347,11 +2347,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Ez dago historiarik oraindik + Ez dago historiarik oraindik. The text that shows as the header for the history list - Memorian ez dago ezer + Memorian ez dago ezer. The text that shows as the header for the memory list @@ -4179,4 +4179,8 @@ Ezarpenen orria Announcement used when Settings page is opened + + Ireki laster-menua eskuragarri dauden ekintzak ikusteko + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/fa-IR/Resources.resw b/src/Calculator/Resources/fa-IR/Resources.resw index a94aab96..ab8f52a0 100644 --- a/src/Calculator/Resources/fa-IR/Resources.resw +++ b/src/Calculator/Resources/fa-IR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - فعلاً هیچ تاریخچه‌ای موجود نیست + فعلاً هیچ تاریخچه‌ای موجود نیست. The text that shows as the header for the history list - هیچ موردی در حافظه ذخیره نشده است + هیچ موردی در حافظه ذخیره نشده است. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ صفحه تنظیمات Announcement used when Settings page is opened + + باز کردن منوی زمینه برای عملکردهای موجود + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/fi-FI/Resources.resw b/src/Calculator/Resources/fi-FI/Resources.resw index 52632c54..aef4695a 100644 --- a/src/Calculator/Resources/fi-FI/Resources.resw +++ b/src/Calculator/Resources/fi-FI/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Historiaa ei vielä ole + Historiaa ei vielä ole. The text that shows as the header for the history list - Muistiin ei ole tallennettu mitään + Muistiin ei ole tallennettu mitään. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Asetussivu Announcement used when Settings page is opened + + Avaa käytettävissä olevien toimintojen pikavalikko + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/fil-PH/Resources.resw b/src/Calculator/Resources/fil-PH/Resources.resw index 244d2e92..9abb4544 100644 --- a/src/Calculator/Resources/fil-PH/Resources.resw +++ b/src/Calculator/Resources/fil-PH/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Wala pang kasaysayan + Wala pang kasaysayan. The text that shows as the header for the history list - Walang naka-save sa memory + Walang naka-save sa memory. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Pahina ng nga setting Announcement used when Settings page is opened + + Buksan ang menu ng konteksto para sa mga available na pagkilos + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/fr-CA/Resources.resw b/src/Calculator/Resources/fr-CA/Resources.resw index 62f91dd4..fde57e06 100644 --- a/src/Calculator/Resources/fr-CA/Resources.resw +++ b/src/Calculator/Resources/fr-CA/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Aucun historique pour l'instant + Il n’existe aucun historique pour l’instant. The text that shows as the header for the history list - Rien n'a été enregistré dans la mémoire + La mémoire est vide. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Page Paramètres Announcement used when Settings page is opened + + Ouvrir le menu contextuel pour les actions disponibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/fr-FR/Resources.resw b/src/Calculator/Resources/fr-FR/Resources.resw index 9fea7cfc..dbb6ddbb 100644 --- a/src/Calculator/Resources/fr-FR/Resources.resw +++ b/src/Calculator/Resources/fr-FR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Aucun historique pour l'instant + Il n’y a aucun historique pour l’instant. The text that shows as the header for the history list - La mémoire est vide + La mémoire est vide. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Page Paramètres Announcement used when Settings page is opened + + Ouvrir le menu contextuel pour les actions disponibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/gl-ES/Resources.resw b/src/Calculator/Resources/gl-ES/Resources.resw index d6958d99..c747f09a 100644 --- a/src/Calculator/Resources/gl-ES/Resources.resw +++ b/src/Calculator/Resources/gl-ES/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Aínda non hai ningún historial + Aínda non hai ningún historial. The text that shows as the header for the history list - Non hai nada gardado na memoria + Non hai nada gardado na memoria. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Páxina de configuración Announcement used when Settings page is opened + + Abrir o menú contexto para as accións dispoñibles + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/he-IL/Resources.resw b/src/Calculator/Resources/he-IL/Resources.resw index 7e05b40c..ebed8091 100644 --- a/src/Calculator/Resources/he-IL/Resources.resw +++ b/src/Calculator/Resources/he-IL/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - אין היסטוריה עדיין + אין היסטוריה עדיין. The text that shows as the header for the history list - דבר לא שמור בזיכרון + אין שום דבר שנשמר בזיכרון. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ דף ההגדרות Announcement used when Settings page is opened + + פתח את התפריט תלוי ההקשר כדי להציג את הפעולות הזמינות + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/hi-IN/Resources.resw b/src/Calculator/Resources/hi-IN/Resources.resw index ba0d1269..54ae5925 100644 --- a/src/Calculator/Resources/hi-IN/Resources.resw +++ b/src/Calculator/Resources/hi-IN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - अभी तक कोई इतिहास नहीं है + अभी तक कोई इतिहास नहीं है. The text that shows as the header for the history list - मेमोरी में कुछ भी नहीं सहेजा गया है + मेमोरी में कुछ भी नहीं सहेजा गया है. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ सेटिंग्स पृष्ठ Announcement used when Settings page is opened + + उपलब्ध क्रियाओं के लिए प्रसंग मेनू खोलें + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/hr-HR/Resources.resw b/src/Calculator/Resources/hr-HR/Resources.resw index 012c61c7..136abb82 100644 --- a/src/Calculator/Resources/hr-HR/Resources.resw +++ b/src/Calculator/Resources/hr-HR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Još nema povijesti + Još nema povijesti. The text that shows as the header for the history list - Ništa nije spremljeno u memoriju + Ništa nije spremljeno u memoriju. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stranica postavki Announcement used when Settings page is opened + + Otvorite kontekstni izbornik za dostupne akcije + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/hu-HU/Resources.resw b/src/Calculator/Resources/hu-HU/Resources.resw index c46e92a3..30e3f9e1 100644 --- a/src/Calculator/Resources/hu-HU/Resources.resw +++ b/src/Calculator/Resources/hu-HU/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Még nincsenek előzmények + Még nincsenek előzmények. The text that shows as the header for the history list - Nincs semmi a memóriában. + Semmi sincs a memóriába mentve. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Beállítások lap Announcement used when Settings page is opened + + Az elérhető műveletek helyi menüjének megnyitása + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/id-ID/Resources.resw b/src/Calculator/Resources/id-ID/Resources.resw index cda7b648..2eda888c 100644 --- a/src/Calculator/Resources/id-ID/Resources.resw +++ b/src/Calculator/Resources/id-ID/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Belum ada riwayat + Belum ada riwayat. The text that shows as the header for the history list - Tidak ada yang disimpan dalam memori + Tidak ada yang disimpan dalam memori. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Halaman pengaturan Announcement used when Settings page is opened + + Buka menu konteks untuk melihat tindakan yang tersedia + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/is-IS/Resources.resw b/src/Calculator/Resources/is-IS/Resources.resw index 3b62eed3..1bbf751f 100644 --- a/src/Calculator/Resources/is-IS/Resources.resw +++ b/src/Calculator/Resources/is-IS/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Enginn ferill enn + Enginn ferill enn. The text that shows as the header for the history list - Ekkert hefur verið vistað í minni + Ekkert hefur verið vistað í minni. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stillingarsíða Announcement used when Settings page is opened + + Opnaðu flýtivalmyndina fyrir tiltækar aðgerðir + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/it-IT/Resources.resw b/src/Calculator/Resources/it-IT/Resources.resw index de6488e3..74303211 100644 --- a/src/Calculator/Resources/it-IT/Resources.resw +++ b/src/Calculator/Resources/it-IT/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Non è ancora presente la cronologia + Non è ancora presente la cronologia. The text that shows as the header for the history list - Nessun elemento salvato in memoria + Nessun elemento salvato in memoria. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Pagina Impostazioni Announcement used when Settings page is opened + + Apri il menu di scelta rapida per le azioni disponibili + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ja-JP/Resources.resw b/src/Calculator/Resources/ja-JP/Resources.resw index 8323a5ae..a9209f1e 100644 --- a/src/Calculator/Resources/ja-JP/Resources.resw +++ b/src/Calculator/Resources/ja-JP/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - まだ履歴がありません + まだ履歴がありません。 The text that shows as the header for the history list - メモリに何も保存されていません + メモリに何も保存されていません。 The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ 設定ページ Announcement used when Settings page is opened + + コンテキスト メニューを開いて使用可能なアクションを表示します + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/kk-KZ/Resources.resw b/src/Calculator/Resources/kk-KZ/Resources.resw index 79b4d702..0c337ea4 100644 --- a/src/Calculator/Resources/kk-KZ/Resources.resw +++ b/src/Calculator/Resources/kk-KZ/Resources.resw @@ -1430,11 +1430,11 @@ An abbreviation for a measurement of speed (Mach is the speed of sound, Mach 2 is 2 times the speed of sound) - Мбит + Мбайт An abbreviation for a measurement unit of data - Мбайт + Mбайт An abbreviation for a measurement unit of data @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Әлі журнал жоқ + Әлі журнал жоқ. The text that shows as the header for the history list - Жадта ешбір нәрсе сақталмаған + Жадыда ешбір нәрсе сақталмаған. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Параметрлер беті Announcement used when Settings page is opened + + Қолжетімді әрекеттер үшін қалқымалы мәзірді ашу + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/km-KH/Resources.resw b/src/Calculator/Resources/km-KH/Resources.resw index 0d5d1efa..4ba37597 100644 --- a/src/Calculator/Resources/km-KH/Resources.resw +++ b/src/Calculator/Resources/km-KH/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - មិនមានប្រវត្តិនៅឡើយ + មិនទាន់មានប្រវត្តិនៅឡើយទេ។ The text that shows as the header for the history list - មិនមានអ្វីត្រូវបានរក្សាទុកក្នុងអង្គចងចាំទេ + មិនមានអ្វីត្រូវបានរក្សាទុកក្នុងអង្គចងចាំទេ។ The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ ទំព័រការកំណត់ Announcement used when Settings page is opened + + បើកម៉ឺនុយបរិបទសម្រាប់សកម្មភាពដែលមាន + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/kn-IN/Resources.resw b/src/Calculator/Resources/kn-IN/Resources.resw index b7a14460..901ce42a 100644 --- a/src/Calculator/Resources/kn-IN/Resources.resw +++ b/src/Calculator/Resources/kn-IN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - ಇನ್ನೂ ಯಾವುದೇ ಇತಿಹಾಸವಿಲ್ಲ + ಇನ್ನೂ ಯಾವುದೇ ಇತಿಹಾಸವಿಲ್ಲ. The text that shows as the header for the history list - ಸ್ಮರಣೆಯಲ್ಲಿ ಏನನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ + ಸ್ಮರಣೆಯಲ್ಲಿ ಏನನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪುಟ Announcement used when Settings page is opened + + ಲಭ್ಯವಿರುವ ಕ್ರಿಯೆಗಳಿಗೆ ಸಂದರ್ಭ ಮೆನು ತೆರೆಯಿರಿ + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ko-KR/Resources.resw b/src/Calculator/Resources/ko-KR/Resources.resw index 43690b9f..880c90d3 100644 --- a/src/Calculator/Resources/ko-KR/Resources.resw +++ b/src/Calculator/Resources/ko-KR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - 아직 기록이 없음 + 아직 기록이 없습니다. The text that shows as the header for the history list - 메모리에 저장된 내용이 없음 + 메모리에 저장된 내용이 없습니다. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ 설정 페이지 Announcement used when Settings page is opened + + 바로 가기 메뉴를 열어 사용 가능한 작업 보기 + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/lo-LA/Resources.resw b/src/Calculator/Resources/lo-LA/Resources.resw index 96d1a6b8..9073e3ef 100644 --- a/src/Calculator/Resources/lo-LA/Resources.resw +++ b/src/Calculator/Resources/lo-LA/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - ຍັງບໍ່ມີປະຫວັດເທື່ອ + ຍັງບໍ່ມີປະຫວັດເທື່ອ. The text that shows as the header for the history list - ບໍ່ໄດ້ມີການບັນທຶກໃດໆໃນໜ່ວຍຄວາມຈຳ + ບໍ່ໄດ້ມີການບັນທຶກໃດໆໃນໜ່ວຍຄວາມຈຳ. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ ຕັ້ງຄ່າໜ້າ Announcement used when Settings page is opened + + ເປີດລາຍການຄຳສັ່ງສໍາລັບການດໍາເນີນການທີ່ມີຢູ່ + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/lt-LT/Resources.resw b/src/Calculator/Resources/lt-LT/Resources.resw index 04062026..d6009c54 100644 --- a/src/Calculator/Resources/lt-LT/Resources.resw +++ b/src/Calculator/Resources/lt-LT/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Istorijos dar nėra + Istorijos dar nėra. The text that shows as the header for the history list - Atmintyje nieko neišsaugota + Atmintyje nieko neišsaugota. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Parametrų puslapis Announcement used when Settings page is opened + + Atidaryti galimų veiksmų kontekstinį meniu + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/lv-LV/Resources.resw b/src/Calculator/Resources/lv-LV/Resources.resw index 93833563..10a6cfcf 100644 --- a/src/Calculator/Resources/lv-LV/Resources.resw +++ b/src/Calculator/Resources/lv-LV/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Vēstures vēl nav + Vēstures vēl nav. The text that shows as the header for the history list - Atmiņā nav nekas saglabāts + Atmiņā nekas nav saglabāts. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Iestatījumu lapa Announcement used when Settings page is opened + + Atveriet pieejamo darbību kontekstizvēlni + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/mk-MK/Resources.resw b/src/Calculator/Resources/mk-MK/Resources.resw index 43a386cc..d459a806 100644 --- a/src/Calculator/Resources/mk-MK/Resources.resw +++ b/src/Calculator/Resources/mk-MK/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Сѐ уште нема историја + Сѐ уште нема историја. The text that shows as the header for the history list - Нема ништо зачувано во меморијата + Нема ништо зачувано во меморијата. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Страницата со параметри Announcement used when Settings page is opened + + Отворете го контекстуалното мени за достапни дејства + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ml-IN/Resources.resw b/src/Calculator/Resources/ml-IN/Resources.resw index a54d47b7..b3688e33 100644 --- a/src/Calculator/Resources/ml-IN/Resources.resw +++ b/src/Calculator/Resources/ml-IN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - അവിടെ ഇതുവരെ ചരിത്രമൊന്നുമില്ല + ഇതുവരെ ചരിത്രമൊന്നുമില്ല. The text that shows as the header for the history list - മെമ്മറിയിൽ ഒന്നും തന്നെ സംരക്ഷിച്ചിട്ടില്ല + മെമ്മറിയിൽ ഒന്നും തന്നെ സംരക്ഷിച്ചിട്ടില്ല. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ സജ്ജീകരണ പേജ് Announcement used when Settings page is opened + + ലഭ്യമായ പ്രവർത്തനങ്ങൾക്കായി സന്ദർഭ മെനു തുറക്കുക + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ms-MY/Resources.resw b/src/Calculator/Resources/ms-MY/Resources.resw index 98f601ea..8154b5ee 100644 --- a/src/Calculator/Resources/ms-MY/Resources.resw +++ b/src/Calculator/Resources/ms-MY/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Belum ada sejarah lagi + Belum ada sejarah lagi. The text that shows as the header for the history list - Tiada apa-apa yang disimpan dalam memori + Tiada apa-apa yang disimpan dalam memori. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Halaman tetapan Announcement used when Settings page is opened + + Buka menu konteks untuk tindakan yang tersedia + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/nb-NO/Resources.resw b/src/Calculator/Resources/nb-NO/Resources.resw index 0bfd1254..18b08a80 100644 --- a/src/Calculator/Resources/nb-NO/Resources.resw +++ b/src/Calculator/Resources/nb-NO/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Det finnes ingen logg ennå + Det finnes ingen logg ennå. The text that shows as the header for the history list - Ingenting er lagret i minnet + Ingenting er lagret i minnet. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Innstillingssiden Announcement used when Settings page is opened + + Åpne hurtigmenyen for å se tilgjengelige handlinger + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/nl-NL/Resources.resw b/src/Calculator/Resources/nl-NL/Resources.resw index 83bdcd7f..9547e3ec 100644 --- a/src/Calculator/Resources/nl-NL/Resources.resw +++ b/src/Calculator/Resources/nl-NL/Resources.resw @@ -1646,7 +1646,7 @@ An abbreviation for a measurement unit of data - Are + Acre A measurement unit for area. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Er is nog geen geschiedenis + Er is nog geen geschiedenis. The text that shows as the header for the history list - Er is niets opgeslagen in het geheugen + Er is niets opgeslagen in het geheugen. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Instellingenpagina Announcement used when Settings page is opened + + Het contextmenu openen voor beschikbare acties + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/pl-PL/Resources.resw b/src/Calculator/Resources/pl-PL/Resources.resw index 26374b80..6afcde80 100644 --- a/src/Calculator/Resources/pl-PL/Resources.resw +++ b/src/Calculator/Resources/pl-PL/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Nie ma jeszcze historii + Nie ma jeszcze historii. The text that shows as the header for the history list - Brak elementów zapisanych w pamięci + Brak elementów zapisanych w pamięci. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Strona ustawień Announcement used when Settings page is opened + + Otwieranie menu kontekstowego dla dostępnych akcji + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/pt-BR/Resources.resw b/src/Calculator/Resources/pt-BR/Resources.resw index 7f3d092f..e13d8f2d 100644 --- a/src/Calculator/Resources/pt-BR/Resources.resw +++ b/src/Calculator/Resources/pt-BR/Resources.resw @@ -2346,7 +2346,7 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Ainda não há histórico + Ainda não há histórico. The text that shows as the header for the history list @@ -4178,4 +4178,8 @@ Página de configurações Announcement used when Settings page is opened + + Abrir o menu de contexto para ações disponíveis + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/pt-PT/Resources.resw b/src/Calculator/Resources/pt-PT/Resources.resw index 49b3a6df..5fa63370 100644 --- a/src/Calculator/Resources/pt-PT/Resources.resw +++ b/src/Calculator/Resources/pt-PT/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Ainda não existe histórico + Ainda não existe histórico. The text that shows as the header for the history list - Não existe nada guardado na memória + Não existe nada guardado na memória. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Página Definições Announcement used when Settings page is opened + + Abrir o menu de contexto para ações disponíveis + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ro-RO/Resources.resw b/src/Calculator/Resources/ro-RO/Resources.resw index d4e183fc..1ff9d2fb 100644 --- a/src/Calculator/Resources/ro-RO/Resources.resw +++ b/src/Calculator/Resources/ro-RO/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Nu există încă un istoric + Nu există niciun istoric deocamdată. The text that shows as the header for the history list - Nu este nimic salvat în memorie + Nu este nimic salvat în memorie. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Pagina de setări Announcement used when Settings page is opened + + Deschideți meniul contextual pentru acțiunile disponibile + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ru-RU/Resources.resw b/src/Calculator/Resources/ru-RU/Resources.resw index cf4113fa..ffea67bb 100644 --- a/src/Calculator/Resources/ru-RU/Resources.resw +++ b/src/Calculator/Resources/ru-RU/Resources.resw @@ -2334,7 +2334,7 @@ {Locked="%1"}. Copyright statement, displayed on the About panel. %1 = the current year (4 digits) - Чтобы узнать, как вы можете участвовать в Windows калькулятора, изучите проект на %HL%GitHub%HL%. + Чтобы узнать, как вы можете участвовать в разработке калькулятора Windows, изучите проект на %HL%GitHub%HL%. {Locked="%HL%GitHub%HL%"}. GitHub link, Displayed on the About panel @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Журнала еще нет + Журнала еще нет. The text that shows as the header for the history list - В памяти ничего не сохранено + Нет сохраненных элементов в памяти. The text that shows as the header for the memory list @@ -3384,7 +3384,7 @@ String describing constant monotonicity of a function - Уменьшающаяся + Убывающая String describing decreasing monotonicity of a function @@ -3392,7 +3392,7 @@ Error displayed when monotonicity cannot be determined - Увеличивающаяся + Возрастающая String describing increasing monotonicity of a function @@ -3452,7 +3452,7 @@ Message displayed when the graph does not have any y-intercepts - Домен + Область определения Title for KeyGraphFeatures Domain Property @@ -3492,11 +3492,11 @@ Title for KeyGraphFeatures Parity Property - Цикл + Период Title for KeyGraphFeatures Periodicity Property. The period of a mathematical function is the smallest interval in its input values such that its output values repeat every such interval. - Диапазон + Область значений Title for KeyGraphFeatures Range Property @@ -3515,11 +3515,11 @@ Не удалось выполнить анализ функции. - Не удалось вычислить домен для этой функции. + Не удается вычислить область значений для этой функции. Error displayed when Domain is not returned from the analyzer. - Не удается вычислить диапазон для этой функции. + Не удается вычислить область значений для этой функции. Error displayed when Range is not returned from the analyzer. @@ -3547,7 +3547,7 @@ Error that occurs during graphing when a factorial has a large n - По модулю можно использовать только целые числа + По модулю можно брать только целые числа Error that occurs during graphing when modulo is used with a float. @@ -3563,7 +3563,7 @@ Error that occurs during graphing when mutually exclusive conditions are used. - Уравнение вне домена + Уравнение вне области определения Error that occurs during graphing when the equation is out of domain. @@ -3583,7 +3583,7 @@ Error that occurs during graphing when a number has too many decimals. Ex: 1.2.3 - В десятичной запятой отсутствуют цифры + Нет цифр рядом с десятичной запятой Error that occurs during graphing with a decimal point without digits @@ -3615,7 +3615,7 @@ Error that occurs during graphing when the expression is empty - Равный был использован без уравнения + Знак равенства использован без уравнения Error that occurs during graphing when equal is used without an equation. Ex: sin(x=y) @@ -3623,7 +3623,7 @@ Error that occurs during graphing when parenthesis are missing after a function. - Математическая операция имеет неверное количество параметров + Неверное количество параметров функции Error that occurs during graphing when a function has the wrong number of parameters @@ -3643,11 +3643,11 @@ Error that occurs during graphing when i or I is used. - Уравнение не может быть построено + График уравнения не может быть построен General error that occurs during graphing. - Цифра не может быть разрешена для данной базы + Цифра не может использоваться с этим основанием Error that occurs during graphing when trying to use bases incorrect. Ex: base(2,1020). @@ -3655,7 +3655,7 @@ Error that occurs during graphing when the base is out of range. - Математическая операция требует, чтобы один из ее параметров был переменной + Один из параметров функции должен быть переменной Error that occurs during graphing when a function requires a variable in a particular position. Ex: 2nd argument of deriv. @@ -3671,11 +3671,11 @@ Error that occurs during graphing when x or y is used in the limit point. - Не может использовать сложную бесконечность + Нельзя использовать комплексную бесконечность Error that occurs during graphing when complex infinity is used - Не может использовать комплексные числа в неравенствах + Нельзя использовать комплексные числа в неравенствах Error that occurs during graphing when complex numbers are used in inequalities. @@ -3771,7 +3771,7 @@ Used in Graphing Calculator to switch the view to the equation mode - Перейти в режим графа + Перейти в режим графика Used in Graphing Calculator to switch the view to the graph mode @@ -4178,4 +4178,8 @@ Страница параметров Announcement used when Settings page is opened + + Открыть контекстное меню для просмотра доступных действий + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/sk-SK/Resources.resw b/src/Calculator/Resources/sk-SK/Resources.resw index ba167eb0..63f93c9b 100644 --- a/src/Calculator/Resources/sk-SK/Resources.resw +++ b/src/Calculator/Resources/sk-SK/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Zatiaľ neexistuje žiadna história + Zatiaľ nie je k dispozícii žiadna história. The text that shows as the header for the history list - V pamäti nie je nič uložené + V pamäti nie je nič uložené. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stránka Nastavenia Announcement used when Settings page is opened + + Otvoriť kontextovú ponuku pre dostupné akcie + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/sl-SI/Resources.resw b/src/Calculator/Resources/sl-SI/Resources.resw index ecef954b..37bd6707 100644 --- a/src/Calculator/Resources/sl-SI/Resources.resw +++ b/src/Calculator/Resources/sl-SI/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Zgodovine še ni + Zgodovine še ni. The text that shows as the header for the history list - Ničesar ni v prostoru za shranjevanje + Ničesar ni v prostoru za shranjevanje. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stran z nastavitvami Announcement used when Settings page is opened + + Odpri priročni meni za dejanja, ki so na voljo + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/sq-AL/Resources.resw b/src/Calculator/Resources/sq-AL/Resources.resw index de7050af..f4516160 100644 --- a/src/Calculator/Resources/sq-AL/Resources.resw +++ b/src/Calculator/Resources/sq-AL/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Nuk ka ende asnjë histori + Nuk ka ende asnjë histori. The text that shows as the header for the history list - Nuk ka asgjë të ruajtur në memorie + Nuk ka asgjë të ruajtur në memorie. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Faqja e konfigurimeve Announcement used when Settings page is opened + + Hap menynë e kontekstit për veprimet në dispozicion + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/sr-Latn-RS/Resources.resw b/src/Calculator/Resources/sr-Latn-RS/Resources.resw index e7e26ef3..1825d4e6 100644 --- a/src/Calculator/Resources/sr-Latn-RS/Resources.resw +++ b/src/Calculator/Resources/sr-Latn-RS/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Još uvek nema istorije + Još uvek nema istorije. The text that shows as the header for the history list - Ništa nije sačuvano u memoriji + Ništa nije sačuvano u memoriji. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Stranica sa postavkama Announcement used when Settings page is opened + + Otvorite kontekstualni meni za dostupne radnje + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/sv-SE/Resources.resw b/src/Calculator/Resources/sv-SE/Resources.resw index f9a10fcc..45d7c6c4 100644 --- a/src/Calculator/Resources/sv-SE/Resources.resw +++ b/src/Calculator/Resources/sv-SE/Resources.resw @@ -1658,7 +1658,7 @@ A measurement unit for energy. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - BTU/minut + BTU per minut A measurement unit for power: British Thermal Units per minute. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1666,7 +1666,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Termiska kalorier + Kalorier A measurement unit for energy. Please note that this is the "small calorie" used in science for measuring heat energy, not the "large calorie" commonly used for measuring food energy. If there is a simple term to distinguish this one from the large "Food calorie", please use that. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1726,7 +1726,7 @@ A measurement unit for energy. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Pundfot/minut + Pundfot per minut A measurement unit for power. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1758,7 +1758,7 @@ A measurement unit for energy. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Kilowatt-hours + Kilowatt-timmar A measurement unit for electricity consumption. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1774,7 +1774,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Kalorier + Kilokalorier A measurement unit for energy. The scientific name is kilocalorie, but this is what is commonly referred to as a "calorie" or "large calorie" when talking about food. Please use the everyday-use word for food energy calories if there is one. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1806,7 +1806,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - MB + Megabyte A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2030,7 +2030,7 @@ A measurement unit for Angle. - Gradians + Gon A measurement unit for Angle. @@ -2038,7 +2038,7 @@ A measurement unit for Pressure. - Barer + Bar A measurement unit for Pressure. @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Det finns ingen historik än + Det finns ingen historik än. The text that shows as the header for the history list - Det finns inget sparat i minnet + Det finns inget sparat i minnet. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Sidan Inställningar Announcement used when Settings page is opened + + Öppna snabbmenyn för tillgängliga åtgärder + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/ta-IN/Resources.resw b/src/Calculator/Resources/ta-IN/Resources.resw index 1649c4cb..ab5db3f9 100644 --- a/src/Calculator/Resources/ta-IN/Resources.resw +++ b/src/Calculator/Resources/ta-IN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - இங்கு இதுவரை வரலாறு ஏதுமில்லை + இங்கு இதுவரை வரலாறு ஏதுமில்லை. The text that shows as the header for the history list - நினைவகத்தில் எதுவும் சேமிக்கப்படவில்லை + நினைவகத்தில் எதுவும் சேமிக்கப்படவில்லை. The text that shows as the header for the memory list @@ -4179,4 +4179,8 @@ அமைப்புகள் பக்கம் Announcement used when Settings page is opened + + கிடைக்கக்கூடிய செயல்களுக்கு சூழல் மெனுவைத் திறக்கவும் + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/te-IN/Resources.resw b/src/Calculator/Resources/te-IN/Resources.resw index b031042b..7a47c774 100644 --- a/src/Calculator/Resources/te-IN/Resources.resw +++ b/src/Calculator/Resources/te-IN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - ఇప్పటికీ చరిత్ర లేదు + ఇంకా చరిత్ర లేదు. The text that shows as the header for the history list - మెమరీలో ఏమీ సేవ్ కాలేదు + మెమరీలో ఏదీ సేవ్ చేయబడలేదు. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ సెట్టింగ్‌ల పేజీ Announcement used when Settings page is opened + + అందుబాటులో ఉన్న చర్యల కోసం సందర్భ మెనుని తెరవండి + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/th-TH/Resources.resw b/src/Calculator/Resources/th-TH/Resources.resw index 2895fa6c..fca2a0b4 100644 --- a/src/Calculator/Resources/th-TH/Resources.resw +++ b/src/Calculator/Resources/th-TH/Resources.resw @@ -4178,4 +4178,8 @@ เพจการตั้งค่า Announcement used when Settings page is opened + + เปิดเมนูบริบทสําหรับการดําเนินการที่พร้อมใช้งาน + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/tr-TR/Resources.resw b/src/Calculator/Resources/tr-TR/Resources.resw index cba84709..696df86c 100644 --- a/src/Calculator/Resources/tr-TR/Resources.resw +++ b/src/Calculator/Resources/tr-TR/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Henüz geçmiş yok + Henüz geçmiş yok. The text that shows as the header for the history list - Belleğe kaydedilmiş bir şey yok + Belleğe kaydedilmiş bir şey yok. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Ayarlar sayfası Announcement used when Settings page is opened + + Kullanılabilir eylemler için bağlam menüsünü açın + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/uk-UA/Resources.resw b/src/Calculator/Resources/uk-UA/Resources.resw index 1c885684..fac3d616 100644 --- a/src/Calculator/Resources/uk-UA/Resources.resw +++ b/src/Calculator/Resources/uk-UA/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Записів журналу ще немає + Записів журналу ще немає. The text that shows as the header for the history list - У пам’яті нічого не збережено + У пам’яті нічого не збережено. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Сторінка параметрів Announcement used when Settings page is opened + + Відкрити контекстне меню для доступних дій + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/vi-VN/Resources.resw b/src/Calculator/Resources/vi-VN/Resources.resw index 38e3584b..99ec05aa 100644 --- a/src/Calculator/Resources/vi-VN/Resources.resw +++ b/src/Calculator/Resources/vi-VN/Resources.resw @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - Chưa có lịch sử + Chưa có lịch sử. The text that shows as the header for the history list - Không có nội dung nào được lưu trong bộ nhớ + Không có nội dung nào được lưu trong bộ nhớ. The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ Trang cài đặt Announcement used when Settings page is opened + + Mở menu ngữ cảnh cho các hành động có sẵn + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/zh-CN/Resources.resw b/src/Calculator/Resources/zh-CN/Resources.resw index d2fee295..c8e94968 100644 --- a/src/Calculator/Resources/zh-CN/Resources.resw +++ b/src/Calculator/Resources/zh-CN/Resources.resw @@ -2066,7 +2066,7 @@ A measurement unit for weight. Note: Dekagram is spelled "decagram" everywhere except where US English is used. (EN-US dekagram, elsewhere decagram). (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - 十分之一克 + 分克 A measurement unit for weight. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - 尚无历史记录 + 尚无历史记录。 The text that shows as the header for the history list - 存储器中未保存数据 + 内存中未保存任何内容。 The text that shows as the header for the memory list @@ -4178,4 +4178,8 @@ “设置”页面 Announcement used when Settings page is opened + + 打开可用操作的上下文菜单 + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Resources/zh-TW/Resources.resw b/src/Calculator/Resources/zh-TW/Resources.resw index 8b283fcd..369f6306 100644 --- a/src/Calculator/Resources/zh-TW/Resources.resw +++ b/src/Calculator/Resources/zh-TW/Resources.resw @@ -1806,7 +1806,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Megabyte + Mega 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1858,11 +1858,11 @@ A measurement unit for length. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Petabit + Peta 位元 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - P 位元組 + Peta 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -1902,7 +1902,7 @@ A measurement unit for area. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - T 位元 + Tera 位元 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2346,11 +2346,11 @@ The text that shows in the dropdown navigation control to give the user the option to send feedback about the app and it launches Windows Feedback app - 尚無歷程記錄 + 尚無歷程記錄。 The text that shows as the header for the history list - 記憶中沒有儲存任何項目 + 記憶體中沒有儲存任何項目。 The text that shows as the header for the memory list @@ -2366,11 +2366,11 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Gibibyte + Gibi 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Kibibit + Kibi 位元 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2402,7 +2402,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Exabit + Exa 位元 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2414,15 +2414,15 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Exbibyte + Exbi 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Zetabit + Zeta 位元 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Zetabyte + Zeta 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -2430,7 +2430,7 @@ A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) - Zebibyte + Zebi 位元組 A measurement unit for data. (Please choose the most appropriate plural form to fit any number between 0 and 999,999,999,999,999) @@ -4178,4 +4178,8 @@ 設定頁面 Announcement used when Settings page is opened + + 開啟操作功能表以執行可用的動作 + Screen reader prompt for the context menu of the expression box + \ No newline at end of file diff --git a/src/Calculator/Views/Calculator.xaml b/src/Calculator/Views/Calculator.xaml index b7c3b85a..60db59c9 100644 --- a/src/Calculator/Views/Calculator.xaml +++ b/src/Calculator/Views/Calculator.xaml @@ -1170,183 +1170,212 @@ Tapped="DockPanelTapped" Template="{StaticResource DockPanelTemplate}"> - - + + + + + + + + + + AutomationProperties.Name="{x:Bind HistoryPivotItemUiaName, Mode=OneWay}"> + AutomationProperties.Name="{x:Bind MemoryPivotItemUiaName, Mode=OneWay}"> (string)GetValue(HistoryPivotItemUiaNameProperty); + set => SetValue(HistoryPivotItemUiaNameProperty, value); + } + + // Using a DependencyProperty as the backing store for HistoryPivotItemUiaName. This enables animation, styling, binding, etc... + public static readonly DependencyProperty HistoryPivotItemUiaNameProperty = + DependencyProperty.Register(nameof(HistoryPivotItemUiaName), typeof(string), typeof(Calculator), new PropertyMetadata(string.Empty)); + + public string MemoryPivotItemUiaName + { + get => (string)GetValue(MemoryPivotItemUiaNameProperty); + set => SetValue(MemoryPivotItemUiaNameProperty, value); + } + + // Using a DependencyProperty as the backing store for MemoryPivotItemUiaName. This enables animation, styling, binding, etc... + public static readonly DependencyProperty MemoryPivotItemUiaNameProperty = + DependencyProperty.Register(nameof(MemoryPivotItemUiaName), typeof(string), typeof(Calculator), new PropertyMetadata(string.Empty)); + public System.Windows.Input.ICommand HistoryButtonPressed { get @@ -159,6 +179,7 @@ namespace CalculatorApp { if (m_historyList == null) { + historyVM.PropertyChanged += (s, e) => UpdateHistoryState(); m_historyList = new HistoryList { DataContext = historyVM @@ -296,6 +317,7 @@ namespace CalculatorApp MemRecall.IsEnabled = false; ClearMemoryButton.IsEnabled = false; } + MemoryPivotItemUiaName = GetMemoryPivotItemUiaString(Model.IsMemoryEmpty); if (DockPanel.Visibility == Visibility.Visible) { @@ -328,6 +350,7 @@ namespace CalculatorApp { DockPivot.SelectedIndex = 0; } + HistoryPivotItemUiaName = GetHistoryPivotItemUiaString(Model.HistoryVM.ItemsCount == 0); } else { @@ -748,7 +771,10 @@ namespace CalculatorApp private void SetChildAsMemory() { - DockMemoryHolder.Child = GetMemory(); + if (DockMemoryHolder.Child != GetMemory()) + { + DockMemoryHolder.Child = GetMemory(); + } } private void SetChildAsHistory() @@ -758,7 +784,10 @@ namespace CalculatorApp InitializeHistoryView(Model.HistoryVM); } - DockHistoryHolder.Child = m_historyList; + if (DockHistoryHolder.Child != m_historyList) + { + DockHistoryHolder.Child = m_historyList; + } } private Memory GetMemory() @@ -843,5 +872,19 @@ namespace CalculatorApp var mode = IsStandard ? ViewMode.Standard : IsScientific ? ViewMode.Scientific : ViewMode.Programmer; TraceLogger.GetInstance().LogVisualStateChanged(mode, e.NewState.Name, IsAlwaysOnTop); } + + private string GetMemoryPivotItemUiaString(bool isEmpty) + { + var loader = ResourceLoader.GetForCurrentView(); + var label = loader.GetString("MemoryLabel/Text"); + return isEmpty ? $"{loader.GetString("MemoryPaneEmpty/Text")} {label}" : label; + } + + private string GetHistoryPivotItemUiaString(bool isEmpty) + { + var loader = ResourceLoader.GetForCurrentView(); + var label = loader.GetString("HistoryLabel/Text"); + return isEmpty ? $"{loader.GetString("HistoryEmpty/Text")} {label}" : label; + } } } diff --git a/src/Calculator/Views/DateCalculator.xaml b/src/Calculator/Views/DateCalculator.xaml index 3d088ab6..3ffe7255 100644 --- a/src/Calculator/Views/DateCalculator.xaml +++ b/src/Calculator/Views/DateCalculator.xaml @@ -223,7 +223,7 @@ - + @@ -1023,7 +1023,12 @@ - + + + + + + diff --git a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml index a14e5b4f..d47d1825 100644 --- a/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml +++ b/src/Calculator/Views/GraphingCalculator/EquationInputArea.xaml @@ -661,6 +661,7 @@ FontSize="{TemplateBinding FontSize}" FontWeight="{TemplateBinding FontWeight}" AcceptsReturn="false" + AutomationProperties.Name="{utils:ResourceString Name=MathRichEditBox/[using:Windows.UI.Xaml.Automation]AutomationProperties/Name}" InputScope="Text" MathText="{Binding MathEquation, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" MaxLength="2048" diff --git a/src/Calculator/WindowFrameService.cs b/src/Calculator/WindowFrameService.cs deleted file mode 100644 index 55f5c7d8..00000000 --- a/src/Calculator/WindowFrameService.cs +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using CalculatorApp.Common; -using CalculatorApp.ViewModel.Common; - -using System; -using System.Collections.Generic; -using System.Data; -using System.Diagnostics; -using System.Threading.Tasks; - -using Windows.ApplicationModel.Core; -using Windows.UI.Core; -using Windows.UI.ViewManagement; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; - -namespace CalculatorApp -{ - public sealed class WindowFrameService - { - public Page GetCurrentPage() - { - return (m_frame.Content as Page); - } - - public void SetNewFrame(Windows.UI.Xaml.Controls.Frame frame) - { - Debug.Assert(frame.BackStackDepth == 0); - m_frame = frame; - } - - // createdByUs means any window that we create. - // !createdByUs means the main window - internal static WindowFrameService CreateNewWindowFrameService(Frame viewFrame, bool createdByUs, WeakReference parent) - { - Debug.Assert(CoreWindow.GetForCurrentThread() != null); - var frameService = new WindowFrameService(viewFrame, parent); - frameService.InitializeFrameService(createdByUs); - return frameService; - } - - public CoreDispatcher GetCoreDispatcher() - { - return m_coreDispatcher; - } - - public int GetViewId() - { - return m_viewId; - } - - public void RegisterOnWindowClosingHandler(Action onWindowClosingHandler) - { - m_onWindowClosingHandlers.Add(onWindowClosingHandler); - } - - public Task HandleViewRelease() - { - TaskCompletionSource tsource = new TaskCompletionSource(); - _ = m_coreDispatcher.RunAsync(CoreDispatcherPriority.Low, () => - { - KeyboardShortcutManager.OnWindowClosed(this.m_viewId); - Window.Current.Content = null; - this.InvokeWindowClosingHandlers(); - // This is to ensure InvokeWindowClosingHandlers is be done before RemoveWindowFromMap - // If InvokeWindowClosingHandlers throws any exception we want it to crash the application - // so we are OK not setting closingHandlersCompletedEvent in that case - tsource.SetResult(new object()); - this.m_coreDispatcher.StopProcessEvents(); - Window.Current.Close(); - }); - - return tsource.Task; - } - - // Throws InvalidArgumentException if a service is already registered with the specified id - public void RegisterRuntimeWindowService(Type serviceId, object service) - { - if (TryResolveRuntimeWindowService(serviceId) != null) - { - throw new DuplicateNameException(serviceId + " already registered"); - } - - m_runtimeServicesMap[serviceId.Name] = service; - } - - // Returns false if no service was registered with the specified id - public bool RemoveRuntimeWindowService(Type serviceId) - { - return m_runtimeServicesMap.Remove(serviceId.Name); - } - - // Throws InvalidArgumentException if no service is registered with the specified id - public object ResolveRuntimeWindowService(Type serviceId) - { - var service = TryResolveRuntimeWindowService(serviceId); - - if (service != null) - { - return service; - } - else - { - throw new EntryPointNotFoundException(serviceId.Name + " not found"); - } - } - - public Frame GetFrame() - { - return m_frame; - } - - public void InvokeWindowClosingHandlers() - { - // Should be called only once just before we kill the window. - foreach (var handler in m_onWindowClosingHandlers) - { - handler(); - } - m_onWindowClosingHandlers.Clear(); - } - - private WindowFrameService(Frame frame, WeakReference parent) - { - m_currentWindow = CoreWindow.GetForCurrentThread(); - m_coreDispatcher = m_currentWindow.Dispatcher; - m_frame = frame; - m_parent = parent; - m_viewId = ApplicationView.GetApplicationViewIdForWindow(m_currentWindow); - } - - private void InitializeFrameService(bool createdByUs) - { - Debug.Assert(createdByUs == (!CoreApplication.GetCurrentView().IsHosted && !CoreApplication.GetCurrentView().IsMain)); - if (createdByUs) - { - ApplicationView.GetForCurrentView().Consolidated += OnConsolidated; - } - else - { - CoreWindow.GetForCurrentThread().Closed += OnClosed; - } - } - - private void OnConsolidated(ApplicationView sender, ApplicationViewConsolidatedEventArgs e) - { - TraceLogger.GetInstance().DecreaseWindowCount(); - if (m_parent.IsAlive) - { - var parent = m_parent.Target as App; - parent.RemoveWindow(this); - } - } - - private void OnClosed(CoreWindow sender, CoreWindowEventArgs args) - { - if (m_parent.IsAlive) - { - var parent = m_parent.Target as App; - parent.RemoveSecondaryWindow(this); - } - } - - // Returns nullptr if no service is registered with the specified id - private object TryResolveRuntimeWindowService(Type serviceId) - { - if (m_runtimeServicesMap.TryGetValue(serviceId.Name, out object retval)) - { - return retval; - } - else - { - return null; - } - } - - private readonly Windows.UI.Core.CoreWindow m_currentWindow; - private readonly Windows.UI.Core.CoreDispatcher m_coreDispatcher; - private Windows.UI.Xaml.Controls.Frame m_frame; - private readonly int m_viewId; - private readonly WeakReference m_parent; - - private readonly Dictionary m_runtimeServicesMap = new Dictionary(); - private readonly List m_onWindowClosingHandlers = new List(); - } -} - diff --git a/src/GraphControl/Control/Grapher.cpp b/src/GraphControl/Control/Grapher.cpp index 564188e4..81191a75 100644 --- a/src/GraphControl/Control/Grapher.cpp +++ b/src/GraphControl/Control/Grapher.cpp @@ -11,7 +11,6 @@ using namespace GraphControl; using namespace GraphControl::DX; using namespace Platform; using namespace Platform::Collections; -using namespace std; using namespace Concurrency; using namespace Windows::Devices::Input; using namespace Windows::Foundation; @@ -54,9 +53,9 @@ namespace // posX/posY are the pointer position elements and width,height are the dimensions of the graph surface. // The graphing engine interprets x,y position between the range [-1, 1]. // Translate the pointer position to the [-1, 1] bounds. - __inline pair PointerPositionToGraphPosition(double posX, double posY, double width, double height) + __inline std::pair PointerPositionToGraphPosition(double posX, double posY, double width, double height) { - return make_pair((2 * posX / width - 1), (1 - 2 * posY / height)); + return { (2 * posX / width - 1), (1 - 2 * posY / height) }; } } @@ -71,7 +70,7 @@ namespace GraphControl m_solver->ParsingOptions().SetFormatType(s_defaultFormatType); m_solver->FormatOptions().SetFormatType(s_defaultFormatType); - m_solver->FormatOptions().SetMathMLPrefix(wstring(L"mml")); + m_solver->FormatOptions().SetMathMLPrefix(L"mml"); DefaultStyleKey = StringReference(s_defaultStyleKey); @@ -95,21 +94,10 @@ namespace GraphControl { if (m_graph != nullptr && m_renderMain != nullptr) { - if (auto renderer = m_graph->GetRenderer()) + if (auto renderer = m_graph->GetRenderer(); static_cast(renderer) && SUCCEEDED(renderer->ScaleRange(centerX, centerY, scale))) { - m_renderMain->GetCriticalSection().lock(); - - if (SUCCEEDED(renderer->ScaleRange(centerX, centerY, scale))) - { - m_renderMain->GetCriticalSection().unlock(); - - m_renderMain->RunRenderPass(); - GraphViewChangedEvent(this, GraphViewChangedReason::Manipulation); - } - else - { - m_renderMain->GetCriticalSection().unlock(); - } + m_renderMain->RunRenderPass(); + GraphViewChangedEvent(this, GraphViewChangedReason::Manipulation); } } } @@ -251,7 +239,7 @@ namespace GraphControl if (auto analyzer = graph->GetAnalyzer()) { - vector equationVector; + std::vector equationVector; equationVector.push_back(equation); UpdateGraphOptions(graph->GetOptions(), equationVector); bool variableIsNotX; @@ -325,15 +313,15 @@ namespace GraphControl task Grapher::TryUpdateGraph(bool keepCurrentView) { - optional>> initResult = nullopt; + std::optional>> initResult; bool successful = false; m_errorCode = 0; m_errorType = 0; if (m_renderMain && m_graph != nullptr) { - unique_ptr graphExpression; - wstring request; + std::unique_ptr graphExpression; + std::wstring request; auto validEqs = GetGraphableEquations(); @@ -371,13 +359,12 @@ namespace GraphControl co_return false; } - unique_ptr expr; - wstring parsableEquation = s_getGraphOpeningTags; + std::wstring parsableEquation = s_getGraphOpeningTags; parsableEquation += equationRequest; parsableEquation += s_getGraphClosingTags; // Wire up the corresponding error to an error message in the UI at some point - if (!(expr = m_solver->ParseInput(parsableEquation, m_errorCode, m_errorType))) + if (auto expr = m_solver->ParseInput(parsableEquation, m_errorCode, m_errorType); !static_cast(expr)) { co_return false; } @@ -392,11 +379,11 @@ namespace GraphControl { initResult = TryInitializeGraph(keepCurrentView, graphExpression.get()); - if (initResult != nullopt) + if (initResult.has_value()) { - auto graphedEquations = initResult.value(); + auto& graphedEquations = *initResult; - for (int i = 0; i < validEqs.size(); i++) + for (size_t i = 0; i < validEqs.size(); ++i) { validEqs[i]->GraphedEquation = graphedEquations[i]; } @@ -407,8 +394,8 @@ namespace GraphControl m_renderMain->Graph = m_graph; // It is possible that the render fails, in that case fall through to explicit empty initialization - co_await m_renderMain->RunRenderPassAsync(false); - if (m_renderMain->IsRenderPassSuccesful()) + auto succ = co_await m_renderMain->RunRenderPassAsync(false); + if (succ) { UpdateVariables(); successful = true; @@ -417,7 +404,7 @@ namespace GraphControl { // If we failed to render then we have already lost the previous graph shouldKeepPreviousGraph = false; - initResult = nullopt; + initResult.reset(); m_solver->HRErrorToErrorInfo(m_renderMain->GetRenderError(), m_errorCode, m_errorType); } } @@ -427,15 +414,15 @@ namespace GraphControl } } - if (initResult == nullopt) + if (!initResult.has_value()) { // Do not re-initialize the graph to empty if there are still valid equations graphed if (!shouldKeepPreviousGraph) { initResult = TryInitializeGraph(false, nullptr); - if (initResult != nullopt) + if (initResult.has_value()) { - UpdateGraphOptions(m_graph->GetOptions(), vector()); + UpdateGraphOptions(m_graph->GetOptions(), {}); SetGraphArgs(m_graph); m_renderMain->Graph = m_graph; @@ -475,12 +462,10 @@ namespace GraphControl } } - void Grapher::SetGraphArgs(shared_ptr graph) + void Grapher::SetGraphArgs(std::shared_ptr graph) { if (graph != nullptr && m_renderMain != nullptr) { - critical_section::scoped_lock lock(m_renderMain->GetCriticalSection()); - for (auto variablePair : Variables) { graph->SetArgValue(variablePair->Key->Data(), variablePair->Value->Value); @@ -488,17 +473,17 @@ namespace GraphControl } } - shared_ptr Grapher::GetGraph(Equation ^ equation) + std::shared_ptr Grapher::GetGraph(Equation ^ equation) { - shared_ptr graph = m_solver->CreateGrapher(); + std::shared_ptr graph = m_solver->CreateGrapher(); - wstring request = s_getGraphOpeningTags; + std::wstring request = s_getGraphOpeningTags; request += equation->GetRequest()->Data(); request += s_getGraphClosingTags; - if (unique_ptr graphExpression = m_solver->ParseInput(request, m_errorCode, m_errorType)) + if (auto expr = m_solver->ParseInput(request, m_errorCode, m_errorType); static_cast(expr)) { - if (graph->TryInitialize(graphExpression.get())) + if (graph->TryInitialize(expr.get())) { return graph; } @@ -557,19 +542,12 @@ namespace GraphControl if (m_graph != nullptr && m_renderMain != nullptr) { - auto workItemHandler = ref new WorkItemHandler([this, variableName, newValue](IAsyncAction ^ action) { - m_renderMain->GetCriticalSection().lock(); - m_graph->SetArgValue(variableName->Data(), newValue); - m_renderMain->GetCriticalSection().unlock(); - - m_renderMain->RunRenderPass(); - }); - - ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::None); + m_graph->SetArgValue(variableName->Data(), newValue); + [](RenderMain ^ renderMain) -> winrt::fire_and_forget { co_await renderMain->RunRenderPassAsync(); }(m_renderMain); } } - void Grapher::UpdateGraphOptions(IGraphingOptions& options, const vector& validEqs) + void Grapher::UpdateGraphOptions(IGraphingOptions& options, const std::vector& validEqs) { options.SetForceProportional(ForceProportionalAxes); @@ -580,7 +558,7 @@ namespace GraphControl if (!validEqs.empty()) { - vector graphColors; + std::vector graphColors; graphColors.reserve(validEqs.size()); for (Equation ^ eq : validEqs) { @@ -595,17 +573,17 @@ namespace GraphControl } eq->GraphedEquation->GetGraphEquationOptions()->SetLineStyle(static_cast<::Graphing::Renderer::LineStyle>(eq->EquationStyle)); - eq->GraphedEquation->GetGraphEquationOptions()->SetLineWidth(LineWidth); - eq->GraphedEquation->GetGraphEquationOptions()->SetSelectedEquationLineWidth(LineWidth + ((LineWidth <= 2) ? 1 : 2)); + eq->GraphedEquation->GetGraphEquationOptions()->SetLineWidth(static_cast(LineWidth)); + eq->GraphedEquation->GetGraphEquationOptions()->SetSelectedEquationLineWidth(static_cast(LineWidth + ((LineWidth <= 2) ? 1 : 2))); } } options.SetGraphColors(graphColors); } } - vector Grapher::GetGraphableEquations() + std::vector Grapher::GetGraphableEquations() { - vector validEqs; + std::vector validEqs; for (Equation ^ eq : Equations) { @@ -783,15 +761,10 @@ namespace GraphControl translationX /= -width; translationY /= height; - m_renderMain->GetCriticalSection().lock(); - if (FAILED(renderer->MoveRangeByRatio(translationX, translationY))) { - m_renderMain->GetCriticalSection().unlock(); return; } - - m_renderMain->GetCriticalSection().unlock(); needsRenderPass = true; } @@ -805,15 +778,10 @@ namespace GraphControl const auto& pos = e->Position; const auto [centerX, centerY] = PointerPositionToGraphPosition(pos.X, pos.Y, width, height); - m_renderMain->GetCriticalSection().lock(); - if (FAILED(renderer->ScaleRange(centerX, centerY, scale))) { - m_renderMain->GetCriticalSection().unlock(); return; } - - m_renderMain->GetCriticalSection().unlock(); needsRenderPass = true; } @@ -834,14 +802,14 @@ namespace GraphControl { if (auto renderer = m_graph->GetRenderer()) { - shared_ptr BitmapOut; + std::shared_ptr BitmapOut; bool hasSomeMissingDataOut = false; HRESULT hr = E_FAIL; hr = renderer->GetBitmap(BitmapOut, hasSomeMissingDataOut); if (SUCCEEDED(hr)) { // Get the raw data - vector byteVector = BitmapOut->GetData(); + std::vector byteVector = BitmapOut->GetData(); auto arr = ArrayReference(byteVector.data(), (unsigned int)byteVector.size()); // create a memory stream wrapper @@ -1085,13 +1053,13 @@ void Grapher::OnGraphBackgroundPropertyChanged(Windows::UI::Color /*oldValue*/, } } -void Grapher::OnGridLinesColorPropertyChanged(Windows::UI::Color /*oldValue*/, Windows::UI::Color newValue) +winrt::fire_and_forget Grapher::OnGridLinesColorPropertyChanged(Windows::UI::Color /*oldValue*/, Windows::UI::Color newValue) { if (m_renderMain != nullptr && m_graph != nullptr) { auto gridLinesColor = Graphing::Color(newValue.R, newValue.G, newValue.B, newValue.A); m_graph->GetOptions().SetGridColor(gridLinesColor); - m_renderMain->RunRenderPassAsync(); + co_await m_renderMain->RunRenderPassAsync(); } } @@ -1102,7 +1070,7 @@ void Grapher::OnLineWidthPropertyChanged(double oldValue, double newValue) UpdateGraphOptions(m_graph->GetOptions(), GetGraphableEquations()); if (m_renderMain) { - m_renderMain->SetPointRadius(LineWidth + 1); + m_renderMain->SetPointRadius(static_cast(LineWidth + 1)); m_renderMain->RunRenderPass(); TraceLogger::GetInstance()->LogLineWidthChanged(); @@ -1110,16 +1078,15 @@ void Grapher::OnLineWidthPropertyChanged(double oldValue, double newValue) } } -optional>> Grapher::TryInitializeGraph(bool keepCurrentView, const IExpression* graphingExp) +std::optional>> Grapher::TryInitializeGraph(bool keepCurrentView, const IExpression* graphingExp) { - critical_section::scoped_lock lock(m_renderMain->GetCriticalSection()); if (keepCurrentView || IsKeepCurrentView) { auto renderer = m_graph->GetRenderer(); double xMin, xMax, yMin, yMax; renderer->GetDisplayRanges(xMin, xMax, yMin, yMax); auto initResult = m_graph->TryInitialize(graphingExp); - if (initResult != nullopt) + if (initResult.has_value()) { if (IsKeepCurrentView) { diff --git a/src/GraphControl/Control/Grapher.h b/src/GraphControl/Control/Grapher.h index a4de85b4..26f306e3 100644 --- a/src/GraphControl/Control/Grapher.h +++ b/src/GraphControl/Control/Grapher.h @@ -228,7 +228,6 @@ public enum class GraphViewChangedReason { if (auto render = m_graph->GetRenderer()) { - Concurrency::critical_section::scoped_lock lock(m_renderMain->GetCriticalSection()); render->GetDisplayRanges(*xMin, *xMax, *yMin, *yMax); } } @@ -280,7 +279,7 @@ public enum class GraphViewChangedReason void OnEquationsPropertyChanged(EquationCollection ^ oldValue, EquationCollection ^ newValue); void OnAxesColorPropertyChanged(Windows::UI::Color oldValue, Windows::UI::Color newValue); void OnGraphBackgroundPropertyChanged(Windows::UI::Color oldValue, Windows::UI::Color newValue); - void OnGridLinesColorPropertyChanged(Windows::UI::Color /*oldValue*/, Windows::UI::Color newValue); + winrt::fire_and_forget OnGridLinesColorPropertyChanged(Windows::UI::Color /*oldValue*/, Windows::UI::Color newValue); void OnLineWidthPropertyChanged(double oldValue, double newValue); void OnEquationChanged(Equation ^ equation); void OnEquationStyleChanged(Equation ^ equation); diff --git a/src/GraphControl/DirectX/RenderMain.cpp b/src/GraphControl/DirectX/RenderMain.cpp index 1e53821b..fa5ddb77 100644 --- a/src/GraphControl/DirectX/RenderMain.cpp +++ b/src/GraphControl/DirectX/RenderMain.cpp @@ -30,11 +30,10 @@ namespace namespace GraphControl::DX { RenderMain::RenderMain(SwapChainPanel ^ panel) - : m_deviceResources{ panel } - , m_nearestPointRenderer{ &m_deviceResources } - , m_backgroundColor{ {} } - , m_swapChainPanel{ panel } - , m_TraceLocation(Point(0, 0)) + : m_deviceResources(panel) + , m_nearestPointRenderer(&m_deviceResources) + , m_swapChainPanel(panel) + , m_TraceLocation(Point{ 0, 0 }) , m_Tracing(false) { // Register to be notified if the Device is lost or recreated @@ -97,7 +96,7 @@ namespace GraphControl::DX bool wasPointRendered = m_Tracing; if (CanRenderPoint() || wasPointRendered) { - RunRenderPassAsync(); + [](RenderMain ^ self) -> winrt::fire_and_forget { co_await self->RunRenderPassAsync(); }(this); } } } @@ -111,7 +110,7 @@ namespace GraphControl::DX bool wasPointRendered = m_Tracing; if (CanRenderPoint() || wasPointRendered) { - RunRenderPassAsync(); + [](RenderMain ^ self) -> winrt::fire_and_forget { co_await self->RunRenderPassAsync(); }(this); } } } @@ -146,15 +145,6 @@ namespace GraphControl::DX trackPoint = m_activeTracingPointerLocation; } - if (!m_criticalSection.try_lock()) - { - return false; - } - - m_criticalSection.unlock(); - - critical_section::scoped_lock lock(m_criticalSection); - int formulaId = -1; double outNearestPointValueX, outNearestPointValueY; float outNearestPointLocationX, outNearestPointLocationY; @@ -210,67 +200,37 @@ namespace GraphControl::DX bool RenderMain::RunRenderPass() { - // Non async render passes cancel if they can't obtain the lock immediatly - if (!m_criticalSection.try_lock()) - { - return false; - } - - m_criticalSection.unlock(); - - critical_section::scoped_lock lock(m_criticalSection); - return RunRenderPassInternal(); } - IAsyncAction ^ RenderMain::RunRenderPassAsync(bool allowCancel) + concurrency::task RenderMain::RunRenderPassAsync(bool allowCancel) { - // Try to cancel the renderPass that is in progress - if (m_renderPass != nullptr && m_renderPass->Status == ::AsyncStatus::Started) - { - m_renderPass->Cancel(); - } - - auto device = m_deviceResources; - auto workItemHandler = ref new WorkItemHandler([this, allowCancel](IAsyncAction ^ action) { - critical_section::scoped_lock lock(m_criticalSection); - - // allowCancel is passed as false when the grapher relies on the render pass to validate that an equation can be succesfully rendered. - // Passing false garauntees that another render pass doesn't cancel this one. - if (allowCancel && action->Status == ::AsyncStatus::Canceled) - { - return; - } - - RunRenderPassInternal(); - }); - - m_renderPass = ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::None); - - return m_renderPass; + bool result = false; + auto currentVer = ++m_renderPassVer; + Platform::WeakReference that{ this }; + co_await m_coreWindow->Dispatcher->RunAsync( + CoreDispatcherPriority::High, + ref new DispatchedHandler( + [&] + { + auto self = that.Resolve(); + if (self == nullptr || (allowCancel && m_renderPassVer != currentVer)) + { + return; + } + result = self->RunRenderPassInternal(); + })); + co_return result; } bool RenderMain::RunRenderPassInternal() { - // We are accessing Direct3D resources directly without Direct2D's knowledge, so we - // must manually acquire and apply the Direct2D factory lock. - ID2D1Multithread* m_D2DMultithread; - m_deviceResources.GetD2DFactory()->QueryInterface(IID_PPV_ARGS(&m_D2DMultithread)); - m_D2DMultithread->Enter(); - - bool succesful = Render(); - - if (succesful) + if (Render()) { m_deviceResources.Present(); + return true; } - - // It is absolutely critical that the factory lock be released upon - // exiting this function, or else any consequent Direct2D calls will be blocked. - m_D2DMultithread->Leave(); - - m_isRenderPassSuccesful = succesful; - return m_isRenderPassSuccesful; + return false; } // Renders the current frame according to the current application state. diff --git a/src/GraphControl/DirectX/RenderMain.h b/src/GraphControl/DirectX/RenderMain.h index be021ba5..6e4050aa 100644 --- a/src/GraphControl/DirectX/RenderMain.h +++ b/src/GraphControl/DirectX/RenderMain.h @@ -51,17 +51,7 @@ namespace GraphControl::DX bool RunRenderPass(); - Windows::Foundation::IAsyncAction ^ RunRenderPassAsync(bool allowCancel = true); - - Concurrency::critical_section& GetCriticalSection() - { - return m_criticalSection; - } - - bool IsRenderPassSuccesful() - { - return m_isRenderPassSuccesful; - } + concurrency::task RunRenderPassAsync(bool allowCancel = true); HRESULT GetRenderError(); @@ -185,10 +175,6 @@ namespace GraphControl::DX Windows::Foundation::EventRegistrationToken m_tokenOrientationChanged; Windows::Foundation::EventRegistrationToken m_tokenDisplayContentsInvalidated; - // Track our independent input on a background worker thread. - Windows::Foundation::IAsyncAction ^ m_inputLoopWorker = nullptr; - Windows::UI::Core::CoreIndependentInputSource ^ m_coreInput = nullptr; - double m_XTraceValue; double m_YTraceValue; @@ -198,11 +184,7 @@ namespace GraphControl::DX // Are we currently showing the tracing value bool m_Tracing; - Concurrency::critical_section m_criticalSection; - - Windows::Foundation::IAsyncAction ^ m_renderPass = nullptr; - - bool m_isRenderPassSuccesful; + unsigned m_renderPassVer = 0; HRESULT m_HResult; };