2022-12-30 12:56:30 +00:00
using System ;
using System.IO ;
2026-01-02 04:23:05 +00:00
using System.Runtime.InteropServices ;
2024-12-10 07:09:06 +00:00
using Windows.Win32 ;
using Windows.Win32.Foundation ;
2022-12-30 12:56:30 +00:00
namespace Flow.Launcher.Plugin.Program.Programs
{
// From PT Run
/// <summary>
/// Class to get localized name of shell items like 'My computer'. The localization is based on the 'windows display language'.
/// Reused code from https://stackoverflow.com/questions/41423491/how-to-get-localized-name-of-known-folder for the method <see cref="GetLocalizedName"/>
/// </summary>
public static class ShellLocalization
{
/// <summary>
/// Returns the localized name of a shell item.
/// </summary>
/// <param name="path">Path to the shell item (e. g. shortcut 'File Explorer.lnk').</param>
/// <returns>The localized name as string or <see cref="string.Empty"/>.</returns>
2024-12-10 07:09:06 +00:00
public static unsafe string GetLocalizedName ( string path )
2022-12-30 12:56:30 +00:00
{
2026-01-01 17:47:44 +00:00
int retCode = PInvoke . SHCreateItemFromParsingName ( path , null , typeof ( Windows . Win32 . UI . Shell . IShellItem ) . GUID , out object shellItemObj ) ;
if ( retCode ! = 0 | | shellItemObj is not Windows . Win32 . UI . Shell . IShellItem shellItem )
2022-12-30 12:56:30 +00:00
{
2026-01-01 17:47:44 +00:00
return string . Empty ;
2022-12-30 12:56:30 +00:00
}
2026-01-02 04:23:05 +00:00
try
{
PWSTR displayName ;
shellItem . GetDisplayName ( Windows . Win32 . UI . Shell . SIGDN . SIGDN_NORMALDISPLAY , & displayName ) ;
string filename = displayName . ToString ( ) ;
PInvoke . CoTaskMemFree ( displayName ) ;
return filename ;
}
catch
{
return string . Empty ;
}
finally
{
Marshal . ReleaseComObject ( shellItem ) ;
}
2022-12-30 12:56:30 +00:00
}
/// <summary>
/// This method returns the localized path to a shell item (folder or file)
/// </summary>
/// <param name="path">The path to localize</param>
/// <returns>The localized path or the original path if localized version is not available</returns>
public static string GetLocalizedPath ( string path )
{
path = Environment . ExpandEnvironmentVariables ( path ) ;
string ext = Path . GetExtension ( path ) ;
var pathParts = path . Split ( "\\" ) ;
string [ ] locPath = new string [ pathParts . Length ] ;
for ( int i = 0 ; i < pathParts . Length ; i + + )
{
int iElements = i + 1 ;
string lName = GetLocalizedName ( string . Join ( "\\" , pathParts [ . . iElements ] ) ) ;
locPath [ i ] = ! string . IsNullOrEmpty ( lName ) ? lName : pathParts [ i ] ;
}
string newPath = string . Join ( "\\" , locPath ) ;
newPath = ! newPath . EndsWith ( ext , StringComparison . InvariantCultureIgnoreCase ) ? newPath + ext : newPath ;
return newPath ;
}
}
}