Repository: microsoft/terminal (language: cpp)

Issue:
UI style errors: Menu items capitalization and … (ellipses) mark misuse
### Windows Terminal version

1.20.10572.0

### Windows build number

10.0.22631.3235

### Other Software

_No response_

### Steps to reproduce

Display the tab contextual menu, preferably with a second pane open to show all options.
![image](https://github.com/microsoft/terminal/assets/25664275/469f703e-1a8c-4dae-a7d8-ac11a8da44f6)
There are several problems with this menu.

### First: Excessive capitalization
If you check out the style guide: https://learn.microsoft.com/en-us/style-guide/text-formatting/formatting-common-text-elements
You'll see that `UI text or strings` should use `Sentence-style capitalization`, this is further described at https://learn.microsoft.com/en-us/style-guide/capitalization
```
capitalize the first word and lowercase the rest.
Exceptions: Proper nouns, including brand, product, and service names, are always capitalized.
If a title or heading includes a colon, capitalize the first word after it.
```
`Tab`, `New`, `Window`, `Right` are not brands, products, or service names, they should not be capitalized.
This looks worse in other languages as determiners make the capitalized words lose their vertical alignment, as seen in #16819.

### Second: Misuse of `…` (ellipses)
From the Windows UX design guide: https://learn.microsoft.com/en-us/windows/win32/uxguide/text-ui#guidelines
```
Ellipses mean incompleteness. Use ellipses in UI text as follows:

Commands: Indicate that a command needs additional information.
Don't use an ellipsis whenever an action displays another window only when additional information is required.
For more information, see [Command Buttons](https://learn.microsoft.com/en-us/windows/win32/uxguide/ctrl-command-buttons).

(… more details about truncated text, use in data and labels not included here)
```
I know this is getting out of style, but `…` and `>` next to menu items were originally designed to provide predictability.
The `…` after a menu item means selecting it will display a follow-up dialog or window asking for more options before completing the selected action, while `>` after a menu item means selecting it will display a cascading submenu, finally, neither means selecting it will perform the action immediately.
Therefore, they are mutually exclusive, you cannot have `…` and `>` on the same menu item, clicking it either displays a dialog/window, or a submenu, it cannot do both.

More modern Windows UI is trying to get rid of `…` on menu items, trading discoverability and predictability for the sake of visual style, but including it when it doesn't mean a subsequent window will get displayed breaks both the UI guidelines we had since Windows 3.x, and the modern look. Those `Close…` have to go.

Note the tab contextual menu was taken as an example because it contains all the problems I wanted to mention, but other menus also contain similar errors.

### Expected Behavior

UI consistency _(didn't there used to be a UI guidelines check before inclusion as a Windows component?)_.

### Actual Behavior

Unpredictability and confusion 🤪


Discussion / hints:
We would be more than happy to accept a PR that fixes these things! I'll mark it up.
I would also change `Color…` to `Change tab color…`, making it more clear and justifying the `…`, since it clarifies it is the color of the tab that will be changed, but only after a subsequent dialog that requests more information about the color and can still be cancelled.

To old-timers like me, the `…` always mean "it's safe to click to find out more about what this menu item does because there's another step where it can still be cancelled".
I'm still a fresh beginner I saw this as a "good first issue" and thought I would try to take a look at the repository but I can't even navigate the repository successfully to find the relevant files for the issue let alone solve it. If anyone sees this and would like to assist me that would be very much appreciated I want to learn how this program works and more!

@HartJesse Resource files for different languages are in [src/cascadia/TerminalApp/Resources](https://github.com/microsoft/terminal/tree/7f02b25437288b8fb4b688f1b362aaa56344c4d7/src/cascadia/TerminalApp/Resources).

However, I think to fully resolve this issue, all locales must be updated, not just English.
> However, I think to fully resolve this issue, all locales must be updated, not just English.

It will be sufficient to update only the English text. The rest of the localizations are automatically uploaded to a human translation service.
Thanks for the info you all, I just started learning about resource files and how they work as a result of all this. I will continue working on the issues.
I believe I have made the appropriate changes in the associated resource file however I am unable to build and test the repository. I have been trying everything but I keep getting errors stating I need to reconfigure my mappings, solutions need to be built and deployed first etc.  If anyone can point me in the next correct direction that would be amazing!
It's hard to say what your issue is given just your description. I believe it would make things easier if you post screenshots or copy the error message here. Given that you mentioned "mappings" I suspect that you forgot to update your git submodules however. If you open cmd/powershell in the repository you can do this with the following command:
```
git submodule update --init
```
@lhecker Oh yeah I definitely did not do that I will try to do that next thank you! Here is a screenshot of my visual studio right now.
<img width="815" alt="Incorrect config mapping error" src="https://github.com/microsoft/terminal/assets/162785570/5fcd02c6-e80e-468d-9a95-13b8f1665ce1">

Oh! You can ignore that error. VS hates our project and refuses to specify why, but it works fine.

If you select **Debug** and **x64** from those Configuration and Platform dropdowns, **CascadiaPackage** from the Target dropdown, and click the Play/Run button it should work!

Fix patch:
diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw
index 54cd9e9bc30..15b79c40ffc 100644
--- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw
+++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw
@@ -191,43 +191,43 @@
     <value>Multiple panes</value>
   </data>
   <data name="TabCloseSubMenu" xml:space="preserve">
-    <value>Close...</value>
+    <value>Close</value>
   </data>
   <data name="TabCloseAfter" xml:space="preserve">
-    <value>Close Tabs to the Right</value>
+    <value>Close tabs to the right</value>
   </data>
   <data name="TabCloseOther" xml:space="preserve">
-    <value>Close Other Tabs</value>
+    <value>Close other tabs</value>
   </data>
   <data name="TabClose" xml:space="preserve">
-    <value>Close Tab</value>
+    <value>Close tab</value>
   </data>
   <data name="PaneClose" xml:space="preserve">
-    <value>Close Pane</value>
+    <value>Close pane</value>
   </data>
   <data name="SplitTabText" xml:space="preserve">
-    <value>Split Tab</value>
+    <value>Split tab</value>
   </data>
   <data name="SplitPaneText" xml:space="preserve">
-    <value>Split Pane</value>
+    <value>Split pane</value>
   </data>
   <data name="SearchWebText" xml:space="preserve">
-    <value>Web Search</value>
+    <value>Web search</value>
   </data>
   <data name="TabColorChoose" xml:space="preserve">
-    <value>Color...</value>
+    <value>Change tab color</value>
   </data>
   <data name="TabColorCustomButton.Content" xml:space="preserve">
-    <value>Custom...</value>
+    <value>Custom</value>
   </data>
   <data name="TabColorClearButton.Content" xml:space="preserve">
     <value>Reset</value>
   </data>
   <data name="RenameTabText" xml:space="preserve">
-    <value>Rename Tab</value>
+    <value>Rename tab</value>
   </data>
   <data name="DuplicateTabText" xml:space="preserve">
-    <value>Duplicate Tab</value>
+    <value>Duplicate tab</value>
   </data>
   <data name="InvalidBackgroundImage" xml:space="preserve">
     <value>Found a profile with an invalid "backgroundImage". Defaulting that profile to have no background image. Make sure that when setting a "backgroundImage", the value is a valid file path to an image.</value>
@@ -462,7 +462,7 @@
     <value>About</value>
   </data>
   <data name="AboutDialog.PrimaryButtonText" xml:space="preserve">
-    <value>Send Feedback</value>
+    <value>Send feedback</value>
   </data>
   <data name="AboutDialog.CloseButtonText" xml:space="preserve">
     <value>OK</value>
@@ -472,11 +472,11 @@
     <comment>This is the heading for a version number label</comment>
   </data>
   <data name="AboutDialog_GettingStartedLink.Content" xml:space="preserve">
-    <value>Getting Started</value>
+    <value>Getting started</value>
     <comment>A hyperlink name for a guide on how to get started using Terminal</comment>
   </data>
   <data name="AboutDialog_SourceCodeLink.Content" xml:space="preserve">
-    <value>Source Code</value>
+    <value>Source code</value>
     <comment>A hyperlink name for the Terminal's documentation</comment>
   </data>
   <data name="AboutDialog_DocumentationLink.Content" xml:space="preserve">
@@ -484,15 +484,15 @@
     <comment>A hyperlink name for user documentation</comment>
   </data>
   <data name="AboutDialog_ReleaseNotesLink.Content" xml:space="preserve">
-    <value>Release Notes</value>
+    <value>Release notes</value>
     <comment>A hyperlink name for the Terminal's release notes</comment>
   </data>
   <data name="AboutDialog_PrivacyPolicyLink.Content" xml:space="preserve">
-    <value>Privacy Policy</value>
+    <value>Privacy policy</value>
     <comment>A hyperlink name for the Terminal's privacy policy</comment>
   </data>
   <data name="AboutDialog_ThirdPartyNoticesLink.Content" xml:space="preserve">
-    <value>Third-Party Notices</value>
+    <value>Third-Party notices</value>
     <comment>A hyperlink name for the Terminal's third-party notices</comment>
   </data>
   <data name="QuitDialog.CloseButtonText" xml:space="preserve">
@@ -579,10 +579,10 @@
     <value>Failed parsing command line:</value>
   </data>
   <data name="CommandPaletteControlName" xml:space="preserve">
-    <value>Command Palette</value>
+    <value>Command palette</value>
   </data>
   <data name="TabSwitcherControlName" xml:space="preserve">
-    <value>Tab Switcher</value>
+    <value>Tab switcher</value>
   </data>
   <data name="TabSwitcher_SearchBoxText" xml:space="preserve">
     <value>Type a tab name...</value>
@@ -731,10 +731,10 @@
     <value>Maximize</value>
   </data>
   <data name="WindowRestoreDownButtonToolTip" xml:space="preserve">
-    <value>Restore Down</value>
+    <value>Restore down</value>
   </data>
   <data name="CommandPaletteMenuItem" xml:space="preserve">
-    <value>Command Palette</value>
+    <value>Command palette</value>
   </data>
   <data name="NotificationIconFocusTerminal" xml:space="preserve">
     <value>Focus Terminal</value>
@@ -754,7 +754,7 @@
     <value>Split the window and start in given directory</value>
   </data>
   <data name="ExportTabText" xml:space="preserve">
-    <value>Export Text</value>
+    <value>Export text</value>
   </data>
   <data name="ExportFailure" xml:space="preserve">
     <value>Failed to export terminal content</value>
@@ -766,7 +766,7 @@
     <value>Find</value>
   </data>
   <data name="PlainText" xml:space="preserve">
-    <value>Plain Text</value>
+    <value>Plain text</value>
   </data>
   <data name="CloseOnExitInfoBar.Message" xml:space="preserve">
     <value>Termination behavior can be configured in advanced profile settings.</value>
@@ -775,7 +775,7 @@
     <value>Don't show again</value>
   </data>
   <data name="ElevationShield.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
-    <value>This Terminal window is running as Admin</value>
+    <value>This Terminal window is running as administrator</value>
   </data>
   <data name="CommandPalette_MatchesAvailable" xml:space="preserve">
     <value>Suggestions found: {0}</value>
@@ -835,10 +835,10 @@
     <value>Close this tab</value>
   </data>
   <data name="NewTabMenuFolderEmpty" xml:space="preserve">
-    <value>Empty...</value>
+    <value>Empty</value>
   </data>
   <data name="ClosePaneText" xml:space="preserve">
-    <value>Close Pane</value>
+    <value>Close pane</value>
   </data>
   <data name="ClosePaneToolTip" xml:space="preserve">
     <value>Close the active pane if multiple panes are present</value>
@@ -848,13 +848,13 @@
     <comment>Text used to identify the reset button</comment>
   </data>
   <data name="MoveTabToNewWindowText" xml:space="preserve">
-    <value>Move Tab to New Window</value>
+    <value>Move tab to new window</value>
   </data>
   <data name="MoveTabToNewWindowToolTip" xml:space="preserve">
     <value>Moves tab to a new window </value>
   </data>
   <data name="RunAsAdminFlyout.Text" xml:space="preserve">
-    <value>Run as Administrator</value>
+    <value>Run as administrator</value>
     <comment>This text is displayed on context menu for profile entries in add new tab button.</comment>
   </data>
   <data name="TerminalPage_PaneMovedAnnouncement_ExistingTab" xml:space="preserve">
@@ -893,7 +893,7 @@
     <value>If set, the command will be appended to the profile's default command instead of replacing it.</value>
   </data>
   <data name="RestartConnectionText" xml:space="preserve">
-    <value>Restart Connection</value>
+    <value>Restart connection</value>
   </data>
   <data name="RestartConnectionToolTip" xml:space="preserve">
     <value>Restart the active pane connection</value>
diff --git a/src/cascadia/TerminalApp/TerminalTab.cpp b/src/cascadia/TerminalApp/TerminalTab.cpp
index ceb3860f1ff..e0a93ee9275 100644
--- a/src/cascadia/TerminalApp/TerminalTab.cpp
+++ b/src/cascadia/TerminalApp/TerminalTab.cpp
@@ -1372,7 +1372,7 @@ namespace winrt::TerminalApp::implementation
     {
         auto weakThis{ get_weak() };
 
-        // "Color..."
+        // "Change tab color..."
         Controls::MenuFlyoutItem chooseColorMenuItem;
         {
             Controls::FontIcon colorPickSymbol;
@@ -1391,7 +1391,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem renameTabMenuItem;
         {
-            // "Rename Tab"
+            // "Rename tab"
             Controls::FontIcon renameTabSymbol;
             renameTabSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             renameTabSymbol.Glyph(L"\xE8AC"); // Rename
@@ -1408,7 +1408,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem duplicateTabMenuItem;
         {
-            // "Duplicate Tab"
+            // "Duplicate tab"
             Controls::FontIcon duplicateTabSymbol;
             duplicateTabSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             duplicateTabSymbol.Glyph(L"\xF5ED");
@@ -1425,7 +1425,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem splitTabMenuItem;
         {
-            // "Split Tab"
+            // "Split tab"
             Controls::FontIcon splitTabSymbol;
             splitTabSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             splitTabSymbol.Glyph(L"\xF246"); // ViewDashboard
@@ -1442,7 +1442,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem moveTabToNewWindowMenuItem;
         {
-            // "Move Tab to New Window"
+            // "Move tab to new window"
             Controls::FontIcon moveTabToNewWindowTabSymbol;
             moveTabToNewWindowTabSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             moveTabToNewWindowTabSymbol.Glyph(L"\xE8A7");
@@ -1459,7 +1459,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem closePaneMenuItem = _closePaneMenuItem;
         {
-            // "Close Pane"
+            // "Close pane"
             closePaneMenuItem.Click({ get_weak(), &TerminalTab::_closePaneClicked });
             closePaneMenuItem.Text(RS_(L"ClosePaneText"));
 
@@ -1471,7 +1471,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem exportTabMenuItem;
         {
-            // "Export Tab"
+            // "Export tab"
             Controls::FontIcon exportTabSymbol;
             exportTabSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             exportTabSymbol.Glyph(L"\xE74E"); // Save
@@ -1505,7 +1505,7 @@ namespace winrt::TerminalApp::implementation
 
         Controls::MenuFlyoutItem restartConnectionMenuItem = _restartConnectionMenuItem;
         {
-            // "Restart Connection"
+            // "Restart connection"
             Controls::FontIcon restartConnectionSymbol;
             restartConnectionSymbol.FontFamily(Media::FontFamily{ L"Segoe Fluent Icons, Segoe MDL2 Assets" });
             restartConnectionSymbol.Glyph(L"\xE72C");
diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw
index 03e330d9ecd..6179099bdf5 100644
--- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw
+++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw
@@ -118,13 +118,13 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <data name="SetColorSchemeParentCommandName" xml:space="preserve">
-    <value>Select color scheme...</value>
+    <value>Select color scheme</value>
   </data>
   <data name="NewTabParentCommandName" xml:space="preserve">
-    <value>New Tab...</value>
+    <value>New tab</value>
   </data>
   <data name="SplitPaneParentCommandName" xml:space="preserve">
-    <value>Split Pane...</value>
+    <value>Split pane</value>
   </data>
   <data name="ApplicationDisplayNamePortable" xml:space="preserve">
     <value>Terminal (Portable)</value>
@@ -325,7 +325,7 @@
     <comment>{Locked="JSON"}. "JSON" is the extension of the file that will be opened.</comment>
   </data>
   <data name="OpenTabColorPickerCommandKey" xml:space="preserve">
-    <value>Set the tab color...</value>
+    <value>Set the tab color</value>
   </data>
   <data name="PasteTextCommandKey" xml:space="preserve">
     <value>Paste</value>
@@ -347,7 +347,7 @@
     <value>Reset tab title</value>
   </data>
   <data name="OpenTabRenamerCommandKey" xml:space="preserve">
-    <value>Rename tab title...</value>
+    <value>Rename tab title</value>
   </data>
   <data name="ResizePaneCommandKey" xml:space="preserve">
     <value>Resize pane</value>
@@ -441,7 +441,7 @@
     <value>Switch to the last tab</value>
   </data>
   <data name="TabSearchCommandKey" xml:space="preserve">
-    <value>Search for tab...</value>
+    <value>Search for tab</value>
   </data>
   <data name="ToggleAlwaysOnTopCommandKey" xml:space="preserve">
     <value>Toggle always on top mode</value>
@@ -450,10 +450,10 @@
     <value>Toggle command palette</value>
   </data>
   <data name="SuggestionsCommandHistoryCommandKey" xml:space="preserve">
-    <value>Recent commands...</value>
+    <value>Recent commands</value>
   </data>
   <data name="SuggestionsCommandKey" xml:space="preserve">
-    <value>Open suggestions...</value>
+    <value>Open suggestions</value>
   </data>
   <data name="ToggleCommandPaletteCommandLineModeCommandKey" xml:space="preserve">
     <value>Toggle command palette in command line mode</value>
@@ -505,7 +505,7 @@
     <value>Break into the debugger</value>
   </data>
   <data name="OpenSettingsUICommandKey" xml:space="preserve">
-    <value>Open settings...</value>
+    <value>Open settings</value>
   </data>
   <data name="RenameWindowCommandKey" xml:space="preserve">
     <value>Rename window to "{0}"</value>
@@ -515,7 +515,7 @@
     <value>Reset window name</value>
   </data>
   <data name="OpenWindowRenamerCommandKey" xml:space="preserve">
-    <value>Rename window...</value>
+    <value>Rename window</value>
   </data>
   <data name="DisplayWorkingDirectoryCommandKey" xml:space="preserve">
     <value>Display Terminal's current working directory</value>
@@ -566,7 +566,7 @@
     <value>Quit the Terminal</value>
   </data>
   <data name="SetOpacityParentCommandName" xml:space="preserve">
-    <value>Set background opacity...</value>
+    <value>Set background opacity</value>
   </data>
   <data name="IncreaseOpacityCommandKey" xml:space="preserve">
     <value>Increase background opacity by {0}%</value>


Test patch: