mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 18:57:19 +02:00
## Summary of the Pull Request This PR continues the tradition of alphabetical progress. After [MBGA](#41961), we move on to **MCBA — Make Calculator Better Again!** - Introduces limited automatic correction and completion of expressions. - The goal is to allow uninterrupted typing and avoid disruptions when a partially entered expression is temporarily invalid (which previously caused the result to be replaced by an error message or hidden by the fallback). - The implementation intentionally aims for a sweet spot: - Ignores trailing binary operators. - Automatically closes all opened parentheses. - It is not exhaustive; for example, incomplete constants or functions may still result in an invalid query. - Copy current result to the search bar. - Adds an option to copy the current result to the search bar when the user types `=` at the end of the expression. - Adds a new menu item for the same action. - Fixes the **Save** command to also copy the result to the query. - Adds support for the `factorial(x)` function and the `x!` expression. - Factorial calculations are supported up to `170!` (limited by `double`), but display is constrained by decimal conversion and allows direct display of results up to `20!`. - Adds support for the `sign(x)` function. - Adds support for the `π` symbol as an alternative to the `pi` constant. - Adds a context menu item to the result list item and fallback that displays the octal representation of the result. - Implements beautification of the query: - Converts technical symbols such as `*` or `/` to `×` or `÷`, respectively. - Not enabled for fallbacks for now, since the item text should match the query to keep the score intact. - Implements additional normalization of symbols in the query: - Percent: `%`, `%`, `﹪` - Minus: `−`, `-`, `–`, `—` - Factorial: `!`, `!` - Multiplication: `*`, `×`, `∗`, `·`, `⋅`, `✕`, `✖`, `\u2062` (invisible times) - Division: `/`, `÷`, `➗`, `:` - Allows use of `²` and `³` as alternatives to `^2` and `^3`. - Updates the unit test that was culture sensitive to force en-US output (not an actual fix, but at least it clears false positive for now) - Fixes pre-parsing of scientific notation to prevent capturing minus sign as part of it. - Fixes normalization/rounding of the result, so it can display small values (the current solution turned it into a string with scientific notation and couldn't parse it back). - Updates test with new cases ## Pictures? Moving! Previous behavior: https://github.com/user-attachments/assets/ebcdcd85-797a-44f9-a8b1-a0f2f33c6b42 New behavior: https://github.com/user-attachments/assets/5bd94663-a0d0-4d7d-8032-1030e79926c3 <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #43481 - [x] Closes: #43460 - [x] Closes: #42078 - [x] Closes: #41839 - [x] Closes: #39659 - [x] Closes: #40502 - [x] Related to: #41715 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed
232 lines
11 KiB
XML
232 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<root>
|
||
<!--
|
||
Microsoft ResX Schema
|
||
|
||
Version 2.0
|
||
|
||
The primary goals of this format is to allow a simple XML format
|
||
that is mostly human readable. The generation and parsing of the
|
||
various data types are done through the TypeConverter classes
|
||
associated with the data types.
|
||
|
||
Example:
|
||
|
||
... ado.net/XML headers & schema ...
|
||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||
<resheader name="version">2.0</resheader>
|
||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||
</data>
|
||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||
<comment>This is a comment</comment>
|
||
</data>
|
||
|
||
There are any number of "resheader" rows that contain simple
|
||
name/value pairs.
|
||
|
||
Each data row contains a name, and value. The row also contains a
|
||
type or mimetype. Type corresponds to a .NET class that support
|
||
text/value conversion through the TypeConverter architecture.
|
||
Classes that don't support this are serialized and stored with the
|
||
mimetype set.
|
||
|
||
The mimetype is used for serialized objects, and tells the
|
||
ResXResourceReader how to depersist the object. This is currently not
|
||
extensible. For a given mimetype the value must be set accordingly:
|
||
|
||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||
that the ResXResourceWriter will generate, however the reader can
|
||
read any of the formats listed below.
|
||
|
||
mimetype: application/x-microsoft.net.object.binary.base64
|
||
value : The object must be serialized with
|
||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||
: and then encoded with base64 encoding.
|
||
|
||
mimetype: application/x-microsoft.net.object.soap.base64
|
||
value : The object must be serialized with
|
||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||
: and then encoded with base64 encoding.
|
||
|
||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||
value : The object must be serialized into a byte array
|
||
: using a System.ComponentModel.TypeConverter
|
||
: and then encoded with base64 encoding.
|
||
-->
|
||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||
<xsd:element name="root" msdata:IsDataSet="true">
|
||
<xsd:complexType>
|
||
<xsd:choice maxOccurs="unbounded">
|
||
<xsd:element name="metadata">
|
||
<xsd:complexType>
|
||
<xsd:sequence>
|
||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||
</xsd:sequence>
|
||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||
<xsd:attribute name="type" type="xsd:string" />
|
||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||
<xsd:attribute ref="xml:space" />
|
||
</xsd:complexType>
|
||
</xsd:element>
|
||
<xsd:element name="assembly">
|
||
<xsd:complexType>
|
||
<xsd:attribute name="alias" type="xsd:string" />
|
||
<xsd:attribute name="name" type="xsd:string" />
|
||
</xsd:complexType>
|
||
</xsd:element>
|
||
<xsd:element name="data">
|
||
<xsd:complexType>
|
||
<xsd:sequence>
|
||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||
</xsd:sequence>
|
||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||
<xsd:attribute ref="xml:space" />
|
||
</xsd:complexType>
|
||
</xsd:element>
|
||
<xsd:element name="resheader">
|
||
<xsd:complexType>
|
||
<xsd:sequence>
|
||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||
</xsd:sequence>
|
||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||
</xsd:complexType>
|
||
</xsd:element>
|
||
</xsd:choice>
|
||
</xsd:complexType>
|
||
</xsd:element>
|
||
</xsd:schema>
|
||
<resheader name="resmimetype">
|
||
<value>text/microsoft-resx</value>
|
||
</resheader>
|
||
<resheader name="version">
|
||
<value>2.0</value>
|
||
</resheader>
|
||
<resheader name="reader">
|
||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||
</resheader>
|
||
<resheader name="writer">
|
||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||
</resheader>
|
||
<data name="calculator_display_name" xml:space="preserve">
|
||
<value>Calculator</value>
|
||
</data>
|
||
<data name="calculator_title" xml:space="preserve">
|
||
<value>Calculator</value>
|
||
</data>
|
||
<data name="calculator_top_level_subtitle" xml:space="preserve">
|
||
<value>Press = to type an equation</value>
|
||
<comment>{Locked="="}</comment>
|
||
</data>
|
||
<data name="calculator_placeholder_text" xml:space="preserve">
|
||
<value>Type an equation...</value>
|
||
</data>
|
||
<data name="calculator_error" xml:space="preserve">
|
||
<value>Error: {0}</value>
|
||
<comment>{0} will be replaced by an error message from an invalid equation</comment>
|
||
</data>
|
||
<data name="calculator_save_command_name" xml:space="preserve">
|
||
<value>Save</value>
|
||
</data>
|
||
<data name="calculator_copy_command_name" xml:space="preserve">
|
||
<value>Copy</value>
|
||
</data>
|
||
<data name="calculator_calculation_failed_title" xml:space="preserve">
|
||
<value>Failed to calculate the input</value>
|
||
</data>
|
||
<data name="calculator_division_by_zero" xml:space="preserve">
|
||
<value>Expression contains division by zero</value>
|
||
</data>
|
||
<data name="calculator_expression_not_complete" xml:space="preserve">
|
||
<value>Expression wrong or incomplete</value>
|
||
</data>
|
||
<data name="calculator_not_a_number" xml:space="preserve">
|
||
<value>Calculation result is not a valid number (NaN)</value>
|
||
</data>
|
||
<data name="calculator_double_array_returned" xml:space="preserve">
|
||
<value>Unsupported use of square brackets</value>
|
||
</data>
|
||
<data name="calculator_settings_trig_unit_gradians" xml:space="preserve">
|
||
<value>Gradians</value>
|
||
</data>
|
||
<data name="calculator_settings_trig_unit_degrees" xml:space="preserve">
|
||
<value>Degrees</value>
|
||
</data>
|
||
<data name="calculator_settings_trig_unit_radians" xml:space="preserve">
|
||
<value>Radians</value>
|
||
</data>
|
||
<data name="calculator_settings_trig_unit_mode" xml:space="preserve">
|
||
<value>Trigonometry Unit</value>
|
||
</data>
|
||
<data name="calculator_settings_trig_unit_mode_description" xml:space="preserve">
|
||
<value>Specifies the angle unit to use for trigonometry operations</value>
|
||
</data>
|
||
<data name="calculator_settings_out_en_format" xml:space="preserve">
|
||
<value>Use English (United States) number format for output</value>
|
||
</data>
|
||
<data name="calculator_settings_out_en_format_description" xml:space="preserve">
|
||
<value>Ignores your system setting and returns numbers in the format '{0}'.</value>
|
||
<comment>{0} is a placeholder and will be replaced in code.</comment>
|
||
</data>
|
||
<data name="calculator_settings_in_en_format" xml:space="preserve">
|
||
<value>Use English (United States) number format for input</value>
|
||
</data>
|
||
<data name="calculator_settings_in_en_format_description" xml:space="preserve">
|
||
<value>Ignores your system setting and expects numbers in the format '{0}'.</value>
|
||
<comment>{0} is a placeholder and will be replaced in code.</comment>
|
||
</data>
|
||
<data name="calculator_settings_close_on_enter" xml:space="preserve">
|
||
<value>Close on Enter</value>
|
||
</data>
|
||
<data name="calculator_settings_close_on_enter_description" xml:space="preserve">
|
||
<value>Makes Copy and close the primary command</value>
|
||
</data>
|
||
<data name="calculator_settings_replace_input" xml:space="preserve">
|
||
<value>Replace input if query ends with '='</value>
|
||
</data>
|
||
<data name="calculator_settings_replace_input_description" xml:space="preserve">
|
||
<value>When using direct activation, appending '=' to the expression will replace the input with the calculated result (e.g. '=5*3-2=' will change the query to '=13').</value>
|
||
</data>
|
||
<data name="calculator_not_covert_to_decimal" xml:space="preserve">
|
||
<value>Result value was either too large or too small for a decimal number</value>
|
||
</data>
|
||
<data name="calculator_copy_hex" xml:space="preserve">
|
||
<value>Copy hexadecimal</value>
|
||
</data>
|
||
<data name="calculator_copy_binary" xml:space="preserve">
|
||
<value>Copy binary</value>
|
||
</data>
|
||
<data name="calculator_expression_empty" xml:space="preserve">
|
||
<value>Please enter an expression</value>
|
||
</data>
|
||
<data name="calculator_settings_copy_result_to_search_bar" xml:space="preserve">
|
||
<value>Replace query with result on equals</value>
|
||
</data>
|
||
<data name="calculator_settings_copy_result_to_search_bar_description" xml:space="preserve">
|
||
<value>Updates the query to the result when (=) is entered</value>
|
||
</data>
|
||
<data name="calculator_settings_auto_fix_query" xml:space="preserve">
|
||
<value>Fix incomplete calculations automatically</value>
|
||
</data>
|
||
<data name="calculator_settings_auto_fix_query_description" xml:space="preserve">
|
||
<value>Attempt to evaluate incomplete calculations by ignoring extra operators or symbols</value>
|
||
</data>
|
||
<data name="calculator_settings_input_normalization" xml:space="preserve">
|
||
<value>Handle extra operators and symbols</value>
|
||
</data>
|
||
<data name="calculator_settings_input_normalization_description" xml:space="preserve">
|
||
<value>Enable advanced input normalization and extra symbols (e.g. ÷, ×, π)</value>
|
||
</data>
|
||
<data name="calculator_copy_octal" xml:space="preserve">
|
||
<value>Copy octal</value>
|
||
</data>
|
||
</root> |