diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..11a0bcdf6
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,146 @@
+# To learn more about .editorconfig see https://aka.ms/editorconfigdocs
+###############################
+# Core EditorConfig Options #
+###############################
+# All files
+[*]
+indent_style = space
+
+# XML project files
+[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
+indent_size = 2
+
+# XML config files
+[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
+indent_size = 2
+
+# Code files
+[*.{cs,csx,vb,vbx}]
+indent_size = 4
+insert_final_newline = true
+charset = utf-8-bom
+###############################
+# .NET Coding Conventions #
+###############################
+[*.{cs,vb}]
+# Organize usings
+dotnet_sort_system_directives_first = true
+# this. preferences
+dotnet_style_qualification_for_field = false:silent
+dotnet_style_qualification_for_property = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_event = false:silent
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent
+dotnet_style_predefined_type_for_member_access = true:silent
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
+dotnet_style_readonly_field = true:suggestion
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+###############################
+# Naming Conventions #
+###############################
+# Style Definitions
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+# Use PascalCase for constant fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+tab_width = 2
+end_of_line = crlf
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_diagnostic.CA1416.severity = silent
+###############################
+# C# Coding Conventions #
+###############################
+[*.cs]
+dotnet_diagnostics.VSTHRD200.severity = none # VSTHRD200: Use "Async" suffix for async methods
+dotnet_analyzer_diagnostic.VSTHRD200.severity = none # VSTHRD200: Use "Async" suffix for async methods
+# var preferences
+csharp_style_var_for_built_in_types = true:silent
+csharp_style_var_when_type_is_apparent = true:silent
+csharp_style_var_elsewhere = true:silent
+# Expression-bodied members
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_accessors = true:silent
+# Pattern matching preferences
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+# Null-checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+# Modifier preferences
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
+# Expression-level preferences
+csharp_prefer_braces = true:silent
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_pattern_local_over_anonymous_function = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+###############################
+# C# Formatting Rules #
+###############################
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_between_query_expression_clauses = true
+# Indentation preferences
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = flush_left
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+# Wrapping preferences
+csharp_preserve_single_line_statements = true
+csharp_preserve_single_line_blocks = true
+csharp_using_directive_placement = outside_namespace:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_style_namespace_declarations = block_scoped:silent
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+###############################
+# VB Coding Conventions #
+###############################
+[*.vb]
+# Modifier preferences
+visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
deleted file mode 100644
index 23ced593e..000000000
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-name: "\U0001F41E Bug report"
-about: Create a bug report to help us improve Flow Launcher
-title: "[Describe Your Bug]"
-labels: 'bug'
-assignees: ''
-
----
-
-**Describe the bug/issue**
-A clear and concise description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce the behavior:
-1. ...
-2. ...
-3. ...
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**Your System**
-```
-Windows build number: (run "ver" at a command prompt)
-Flow Launcher version: (Settings => About)
-```
-**Flow Launcher Error Log**
-
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml
new file mode 100644
index 000000000..294c06fc1
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yaml
@@ -0,0 +1,80 @@
+name: "\U0001F41E Bug Report"
+description: Create a bug report to help us improve Flow Launcher
+title: "BUG: "
+labels: ["bug"]
+
+body:
+ - type: markdown
+ attributes:
+ value: Thanks for taking the time to fill out this bug report!
+
+ - type: checkboxes
+ attributes:
+ label: Checks
+ options:
+ - label: >
+ I have checked that this issue has not already been reported.
+ - label: >
+ I am using the latest version of Flow Launcher.
+
+ - type: textarea
+ attributes:
+ label: Problem Description
+ description: A clear and concise description of what the problem is.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: To Reproduce
+ description: Steps to reproduce the behavior.
+ value: >
+ 1. ...
+
+ 2. ...
+
+ 3. ...
+
+ - type: textarea
+ attributes:
+ label: Screenshots
+ description: If applicable, add screenshots to help explain your problem.
+
+ - type: input
+ attributes:
+ label: Flow Launcher Version
+ description: Go to "Settings" => "About". If you are using a prerelease version please append the build number.
+ placeholder: "Example: 1.11.0"
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Windows Build Number
+ description: Run "ver" at CMD (command prompt) or go to Windows Settings -> Systems -> About.
+ placeholder: "Example: 10.0.19043.1288"
+ validations:
+ required: true
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Error Log
+ description: >
+ From flow type 'open log location' and find log file with the corresponding date containing the error info.
+ value: >
+
+
+
+ ```shell
+
+
+ Replace this line with the important log contents.
+
+
+ ```
+
+
+
+
+
diff --git a/.github/actions/spelling/README.md b/.github/actions/spelling/README.md
new file mode 100644
index 000000000..1f699f3de
--- /dev/null
+++ b/.github/actions/spelling/README.md
@@ -0,0 +1,17 @@
+# check-spelling/check-spelling configuration
+
+File | Purpose | Format | Info
+-|-|-|-
+[dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary)
+[allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow)
+[reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject)
+[excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes)
+[only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only)
+[patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns)
+[candidate.patterns](candidate.patterns) | Patterns that might be worth adding to [patterns.txt](patterns.txt) | perl regular expression with optional comment block introductions (all matches will be suggested) | [candidates](https://github.com/check-spelling/check-spelling/wiki/Feature:-Suggest-patterns)
+[line_forbidden.patterns](line_forbidden.patterns) | Patterns to flag in checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns)
+[expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect)
+[advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice)
+
+Note: you can replace any of these files with a directory by the same name (minus the suffix)
+and then include multiple files inside that directory (with that suffix) to merge multiple files together.
diff --git a/.github/actions/spelling/advice.md b/.github/actions/spelling/advice.md
new file mode 100644
index 000000000..1004eeaa6
--- /dev/null
+++ b/.github/actions/spelling/advice.md
@@ -0,0 +1,25 @@
+
+If the flagged items are :exploding_head: false positives
+
+If items relate to a ...
+* binary file (or some other file you wouldn't want to check at all).
+
+ Please add a file path to the `excludes.txt` file matching the containing file.
+
+ File paths are Perl 5 Regular Expressions - you can [test](
+https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.
+
+ `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
+../tree/HEAD/README.md) (on whichever branch you're using).
+
+* well-formed pattern.
+
+ If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
+ try adding it to the `patterns.txt` file.
+
+ Patterns are Perl 5 Regular Expressions - you can [test](
+https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.
+
+ Note that patterns can't match multiline strings.
+
+
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
new file mode 100644
index 000000000..00cc67ea0
--- /dev/null
+++ b/.github/actions/spelling/allow.txt
@@ -0,0 +1,5 @@
+github
+https
+ssh
+ubuntu
+runcount
diff --git a/.github/actions/spelling/candidate.patterns b/.github/actions/spelling/candidate.patterns
new file mode 100644
index 000000000..d244bb891
--- /dev/null
+++ b/.github/actions/spelling/candidate.patterns
@@ -0,0 +1,522 @@
+# marker to ignore all code on line
+^.*/\* #no-spell-check-line \*/.*$
+# marker for ignoring a comment to the end of the line
+// #no-spell-check.*$
+
+# patch hunk comments
+^\@\@ -\d+(?:,\d+|) \+\d+(?:,\d+|) \@\@ .*
+# git index header
+index [0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
+
+# cid urls
+(['"])cid:.*?\g{-1}
+
+# data url in parens
+\(data:[^)]*?(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})[^)]*\)
+# data url in quotes
+([`'"])data:.*?(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,}).*\g{-1}
+# data url
+data:[-a-zA-Z=;:/0-9+]*,\S*
+
+# mailto urls
+mailto:[-a-zA-Z=;:/?%&0-9+@.]{3,}
+
+# magnet urls
+magnet:[?=:\w]+
+
+# magnet urls
+"magnet:[^"]+"
+
+# obs:
+"obs:[^"]*"
+
+# The `\b` here means a break, it's the fancy way to handle urls, but it makes things harder to read
+# In this examples content, I'm using a number of different ways to match things to show various approaches
+# asciinema
+\basciinema\.org/a/[0-9a-zA-Z]+
+
+# apple
+\bdeveloper\.apple\.com/[-\w?=/]+
+# Apple music
+\bembed\.music\.apple\.com/fr/playlist/usr-share/[-\w.]+
+
+# appveyor api
+\bci\.appveyor\.com/api/projects/status/[0-9a-z]+
+# appveyor project
+\bci\.appveyor\.com/project/(?:[^/\s"]*/){2}builds?/\d+/job/[0-9a-z]+
+
+# Amazon
+
+# Amazon
+\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)
+# AWS S3
+\b\w*\.s3[^.]*\.amazonaws\.com/[-\w/%_?:=]*
+# AWS execute-api
+\b[0-9a-z]{10}\.execute-api\.[-0-9a-z]+\.amazonaws\.com\b
+# AWS ELB
+\b\w+\.[-0-9a-z]+\.elb\.amazonaws\.com\b
+# AWS SNS
+\bsns\.[-0-9a-z]+.amazonaws\.com/[-\w/%_?:=]*
+# AWS VPC
+vpc-\w+
+
+# While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there
+# YouTube url
+\b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]*
+# YouTube music
+\bmusic\.youtube\.com/youtubei/v1/browse(?:[?&]\w+=[-a-zA-Z0-9?&=_]*)
+# YouTube tag
+<\s*youtube\s+id=['"][-a-zA-Z0-9?_]*['"]
+# YouTube image
+\bimg\.youtube\.com/vi/[-a-zA-Z0-9?&=_]*
+# Google Accounts
+\baccounts.google.com/[-_/?=.:;+%&0-9a-zA-Z]*
+# Google Analytics
+\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]*
+# Google APIs
+\bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+
+# Google Storage
+\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|)
+# Google Calendar
+\bcalendar\.google\.com/calendar(?:/u/\d+|)/embed\?src=[@./?=\w&%]+
+\w+\@group\.calendar\.google\.com\b
+# Google DataStudio
+\bdatastudio\.google\.com/(?:(?:c/|)u/\d+/|)(?:embed/|)(?:open|reporting|datasources|s)/[-0-9a-zA-Z]+(?:/page/[-0-9a-zA-Z]+|)
+# The leading `/` here is as opposed to the `\b` above
+# ... a short way to match `https://` or `http://` since most urls have one of those prefixes
+# Google Docs
+/docs\.google\.com/[a-z]+/(?:ccc\?key=\w+|(?:u/\d+|d/(?:e/|)[0-9a-zA-Z_-]+/)?(?:edit\?[-\w=#.]*|/\?[\w=&]*|))
+# Google Drive
+\bdrive\.google\.com/(?:file/d/|open)[-0-9a-zA-Z_?=]*
+# Google Groups
+\bgroups\.google\.com/(?:(?:forum/#!|d/)(?:msg|topics?|searchin)|a)/[^/\s"]+/[-a-zA-Z0-9$]+(?:/[-a-zA-Z0-9]+)*
+# Google Maps
+\bmaps\.google\.com/maps\?[\w&;=]*
+# Google themes
+themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+.
+# Google CDN
+\bclients2\.google(?:usercontent|)\.com[-0-9a-zA-Z/.]*
+# Goo.gl
+/goo\.gl/[a-zA-Z0-9]+
+# Google Chrome Store
+\bchrome\.google\.com/webstore/detail/[-\w]*(?:/\w*|)
+# Google Books
+\bgoogle\.(?:\w{2,4})/books(?:/\w+)*\?[-\w\d=.]*
+# Google Fonts
+\bfonts\.(?:googleapis|gstatic)\.com/[-/?=:;+&0-9a-zA-Z]*
+# Google Forms
+\bforms\.gle/\w+
+# Google Scholar
+\bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+
+# Google Colab Research Drive
+\bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]*
+
+# GitHub SHAs (api)
+\bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b
+# GitHub SHAs (markdown)
+(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)
+# GitHub SHAs
+\bgithub\.com(?:/[^/\s"]+){2}[@#][0-9a-f]+\b
+# GitHub wiki
+\bgithub\.com/(?:[^/]+/){2}wiki/(?:(?:[^/]+/|)_history|[^/]+(?:/_compare|)/[0-9a-f.]{40,})\b
+# githubusercontent
+/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
+# githubassets
+\bgithubassets.com/[0-9a-f]+(?:[-/\w.]+)
+# gist github
+\bgist\.github\.com/[^/\s"]+/[0-9a-f]+
+# git.io
+\bgit\.io/[0-9a-zA-Z]+
+# GitHub JSON
+"node_id": "[-a-zA-Z=;:/0-9+]*"
+# Contributor
+\[[^\]]+\]\(https://github\.com/[^/\s"]+\)
+# GHSA
+GHSA(?:-[0-9a-z]{4}){3}
+
+# GitLab commit
+\bgitlab\.[^/\s"]*/\S+/\S+/commit/[0-9a-f]{7,16}#[0-9a-f]{40}\b
+# GitLab merge requests
+\bgitlab\.[^/\s"]*/\S+/\S+/-/merge_requests/\d+/diffs#[0-9a-f]{40}\b
+# GitLab uploads
+\bgitlab\.[^/\s"]*/uploads/[-a-zA-Z=;:/0-9+]*
+# GitLab commits
+\bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b
+
+# binanace
+accounts.binance.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
+
+# bitbucket diff
+\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}diff(?:stat|)(?:/[^/\s"]+){2}:[0-9a-f]+
+# bitbucket repositories commits
+\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}commits?/[0-9a-f]+
+# bitbucket commits
+\bbitbucket\.org/(?:[^/\s"]+/){2}commits?/[0-9a-f]+
+
+# bit.ly
+\bbit\.ly/\w+
+
+# bitrise
+\bapp\.bitrise\.io/app/[0-9a-f]*/[\w.?=&]*
+
+# bootstrapcdn.com
+\bbootstrapcdn\.com/[-./\w]+
+
+# cdn.cloudflare.com
+\bcdnjs\.cloudflare\.com/[./\w]+
+
+# circleci
+\bcircleci\.com/gh(?:/[^/\s"]+){1,5}.[a-z]+\?[-0-9a-zA-Z=&]+
+
+# gitter
+\bgitter\.im(?:/[^/\s"]+){2}\?at=[0-9a-f]+
+
+# gravatar
+\bgravatar\.com/avatar/[0-9a-f]+
+
+# ibm
+[a-z.]*ibm\.com/[-_#=:%!?~.\\/\d\w]*
+
+# imgur
+\bimgur\.com/[^.]+
+
+# Internet Archive
+\barchive\.org/web/\d+/(?:[-\w.?,'/\\+&%$#_:]*)
+
+# discord
+/discord(?:app\.com|\.gg)/(?:invite/)?[a-zA-Z0-9]{7,}
+
+# Disqus
+\bdisqus\.com/[-\w/%.()!?&=_]*
+
+# medium link
+\blink\.medium\.com/[a-zA-Z0-9]+
+# medium
+\bmedium\.com/\@?[^/\s"]+/[-\w]+
+
+# microsoft
+\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]*
+# powerbi
+\bapp\.powerbi\.com/reportEmbed/[^"' ]*
+# vs devops
+\bvisualstudio.com(?::443|)/[-\w/?=%&.]*
+# microsoft store
+\bmicrosoft\.com/store/apps/\w+
+
+# mvnrepository.com
+\bmvnrepository\.com/[-0-9a-z./]+
+
+# now.sh
+/[0-9a-z-.]+\.now\.sh\b
+
+# oracle
+\bdocs\.oracle\.com/[-0-9a-zA-Z./_?#&=]*
+
+# chromatic.com
+/\S+.chromatic.com\S*[")]
+
+# codacy
+\bapi\.codacy\.com/project/badge/Grade/[0-9a-f]+
+
+# compai
+\bcompai\.pub/v1/png/[0-9a-f]+
+
+# mailgun api
+\.api\.mailgun\.net/v3/domains/[0-9a-z]+\.mailgun.org/messages/[0-9a-zA-Z=@]*
+# mailgun
+\b[0-9a-z]+.mailgun.org
+
+# /message-id/
+/message-id/[-\w@./%]+
+
+# Reddit
+\breddit\.com/r/[/\w_]*
+
+# requestb.in
+\brequestb\.in/[0-9a-z]+
+
+# sched
+\b[a-z0-9]+\.sched\.com\b
+
+# Slack url
+slack://[a-zA-Z0-9?&=]+
+# Slack
+\bslack\.com/[-0-9a-zA-Z/_~?&=.]*
+# Slack edge
+\bslack-edge\.com/[-a-zA-Z0-9?&=%./]+
+# Slack images
+\bslack-imgs\.com/[-a-zA-Z0-9?&=%.]+
+
+# shields.io
+\bshields\.io/[-\w/%?=&.:+;,]*
+
+# stackexchange -- https://stackexchange.com/feeds/sites
+\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/)
+
+# Sentry
+[0-9a-f]{32}\@o\d+\.ingest\.sentry\.io\b
+
+# Twitter markdown
+\[\@[^[/\]:]*?\]\(https://twitter.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)\)
+# Twitter hashtag
+\btwitter\.com/hashtag/[\w?_=&]*
+# Twitter status
+\btwitter\.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)
+# Twitter profile images
+\btwimg\.com/profile_images/[_\w./]*
+# Twitter media
+\btwimg\.com/media/[-_\w./?=]*
+# Twitter link shortened
+\bt\.co/\w+
+
+# facebook
+\bfburl\.com/[0-9a-z_]+
+# facebook CDN
+\bfbcdn\.net/[\w/.,]*
+# facebook watch
+\bfb\.watch/[0-9A-Za-z]+
+
+# dropbox
+\bdropbox\.com/sh?/[^/\s"]+/[-0-9A-Za-z_.%?=&;]+
+
+# ipfs protocol
+ipfs://[0-9a-z]*
+# ipfs url
+/ipfs/[0-9a-z]*
+
+# w3
+\bw3\.org/[-0-9a-zA-Z/#.]+
+
+# loom
+\bloom\.com/embed/[0-9a-f]+
+
+# regex101
+\bregex101\.com/r/[^/\s"]+/\d+
+
+# figma
+\bfigma\.com/file(?:/[0-9a-zA-Z]+/)+
+
+# freecodecamp.org
+\bfreecodecamp\.org/[-\w/.]+
+
+# image.tmdb.org
+\bimage\.tmdb\.org/[/\w.]+
+
+# mermaid
+\bmermaid\.ink/img/[-\w]+|\bmermaid-js\.github\.io/mermaid-live-editor/#/edit/[-\w]+
+
+# Wikipedia
+\ben\.wikipedia\.org/wiki/[-\w%.#]+
+
+# gitweb
+[^"\s]+/gitweb/\S+;h=[0-9a-f]+
+
+# HyperKitty lists
+/archives/list/[^@/]+\@[^/\s"]*/message/[^/\s"]*/
+
+# lists
+/thread\.html/[^"\s]+
+
+# list-management
+\blist-manage\.com/subscribe(?:[?&](?:u|id)=[0-9a-f]+)+
+
+# kubectl.kubernetes.io/last-applied-configuration
+"kubectl.kubernetes.io/last-applied-configuration": ".*"
+
+# pgp
+\bgnupg\.net/pks/lookup[?&=0-9a-zA-Z]*
+
+# Spotify
+\bopen\.spotify\.com/embed/playlist/\w+
+
+# Mastodon
+\bmastodon\.[-a-z.]*/(?:media/|\@)[?&=0-9a-zA-Z_]*
+
+# scastie
+\bscastie\.scala-lang\.org/[^/]+/\w+
+
+# images.unsplash.com
+\bimages\.unsplash\.com/(?:(?:flagged|reserve)/|)[-\w./%?=%&.;]+
+
+# pastebin
+\bpastebin\.com/[\w/]+
+
+# heroku
+\b\w+\.heroku\.com/source/archive/\w+
+
+# quip
+\b\w+\.quip\.com/\w+(?:(?:#|/issues/)\w+)?
+
+# badgen.net
+\bbadgen\.net/badge/[^")\]'\s]+
+
+# statuspage.io
+\w+\.statuspage\.io\b
+
+# media.giphy.com
+\bmedia\.giphy\.com/media/[^/]+/[\w.?&=]+
+
+# tinyurl
+\btinyurl\.com/\w+
+
+# getopts
+\bgetopts\s+(?:"[^"]+"|'[^']+')
+
+# ANSI color codes
+(?:\\(?:u00|x)1b|\x1b)\[\d+(?:;\d+|)m
+
+# URL escaped characters
+\%[0-9A-F][A-F]
+# IPv6
+\b(?:[0-9a-fA-F]{0,4}:){3,7}[0-9a-fA-F]{0,4}\b
+# c99 hex digits (not the full format, just one I've seen)
+0x[0-9a-fA-F](?:\.[0-9a-fA-F]*|)[pP]
+# Punycode
+\bxn--[-0-9a-z]+
+# sha
+sha\d+:[0-9]*[a-f]{3,}[0-9a-f]*
+# sha-... -- uses a fancy capture
+(['"]|")[0-9a-f]{40,}\g{-1}
+# hex runs
+\b[0-9a-fA-F]{16,}\b
+# hex in url queries
+=[0-9a-fA-F]*?(?:[A-F]{3,}|[a-f]{3,})[0-9a-fA-F]*?&
+# ssh
+(?:ssh-\S+|-nistp256) [-a-zA-Z=;:/0-9+]{12,}
+
+# PGP
+\b(?:[0-9A-F]{4} ){9}[0-9A-F]{4}\b
+# GPG keys
+\b(?:[0-9A-F]{4} ){5}(?: [0-9A-F]{4}){5}\b
+# Well known gpg keys
+.well-known/openpgpkey/[\w./]+
+
+# uuid:
+\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
+# hex digits including css/html color classes:
+(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|u\d+)\b
+# integrity
+integrity="sha\d+-[-a-zA-Z=;:/0-9+]{40,}"
+
+# https://www.gnu.org/software/groff/manual/groff.html
+# man troff content
+\\f[BCIPR]
+# '
+\\\(aq
+
+# .desktop mime types
+^MimeTypes?=.*$
+# .desktop localized entries
+^[A-Z][a-z]+\[[a-z]+\]=.*$
+# Localized .desktop content
+Name\[[^\]]+\]=.*
+
+# IServiceProvider
+\bI(?=(?:[A-Z][a-z]{2,})+\b)
+
+# crypt
+"\$2[ayb]\$.{56}"
+
+# scrypt / argon
+\$(?:scrypt|argon\d+[di]*)\$\S+
+
+# Input to GitHub JSON
+content: "[-a-zA-Z=;:/0-9+]*="
+
+# Python stringprefix / binaryprefix
+# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings
+(?v#
+(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
+# Compiler flags (Scala)
+(?:^|[\t ,>"'`=(])-J-[DPWXY](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
+# Compiler flags
+(?:^|[\t ,"'`=(])-[DPWXYLlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
+# Compiler flags (linker)
+,-B
+# curl arguments
+\b(?:\\n|)curl(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
+# set arguments
+\bset(?:\s+-[abefimouxE]{1,2})*\s+-[abefimouxE]{3,}(?:\s+-[abefimouxE]+)*
+# tar arguments
+\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
+# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...
+\btput\s+(?:(?:-[SV]|-T\s*\w+)\s+)*\w{3,5}\b
+# macOS temp folders
+/var/folders/\w\w/[+\w]+/(?:T|-Caches-)/
diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt
new file mode 100644
index 000000000..224014eba
--- /dev/null
+++ b/.github/actions/spelling/excludes.txt
@@ -0,0 +1,73 @@
+# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes
+(?:^|/)(?i)COPYRIGHT
+(?:^|/)(?i)LICEN[CS]E
+(?:^|/)3rdparty/
+(?:^|/)go\.sum$
+(?:^|/)package(?:-lock|)\.json$
+(?:^|/)vendor/
+\.a$
+\.ai$
+\.avi$
+\.bmp$
+\.bz2$
+\.class$
+\.crt$
+\.dll$
+\.docx?$
+\.drawio$
+\.DS_Store$
+\.eot$
+\.exe$
+\.gif$
+\.gitattributes$
+\.gitignore$
+\.graffle$
+\.gz$
+\.icns$
+\.ico$
+\.jar$
+\.jks$
+\.jpe?g$
+\.key$
+\.lib$
+\.lock$
+\.map$
+\.min\..
+\.mod$
+\.mp[34]$
+\.o$
+\.ocf$
+\.otf$
+\.pdf$
+\.pem$
+\.png$
+\.psd$
+\.pyc$
+\.s$
+\.svgz?$
+\.tar$
+\.tiff?$
+\.ttf$
+\.wav$
+\.webm$
+\.webp$
+\.woff2?$
+\.xlsx?$
+\.zip$
+^\.github/actions/spelling/
+^\Q.github/workflows/spelling.yml\E$
+# Custom
+(?:^|/)Languages/(?!en\.xaml)
+Scripts/
+\.resx$
+^\QPlugins/Flow.Launcher.Plugin.WindowsSettings/WindowsSettings.json\E$
+^\QPlugins/Flow.Launcher.Plugin.WebSearch/setting.json\E$
+(?:^|/)FodyWeavers\.xml
+.editorconfig
+ignore$
+\.ps1$
+\.yml$
+\.sln$
+\.csproj$
+\.DotSettings$
+\.targets$
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
new file mode 100644
index 000000000..0df5228ba
--- /dev/null
+++ b/.github/actions/spelling/expect.txt
@@ -0,0 +1,90 @@
+crowdin
+DWM
+workflows
+wpf
+actionkeyword
+stackoverflow
+Wox
+flowlauncher
+Fody
+stackoverflow
+IContext
+IShell
+IPlugin
+appveyor
+netflix
+youtube
+appdata
+Prioritise
+Segoe
+Google
+Customise
+UWP
+uwp
+Bokmal
+Bokm
+uninstallation
+uninstalling
+voidtools
+fullscreen
+hotkeys
+totalcmd
+lnk
+amazonaws
+mscorlib
+pythonw
+dotnet
+winget
+jjw24
+wolframalpha
+gmail
+duckduckgo
+facebook
+findicon
+baidu
+pls
+websearch
+qianlifeng
+userdata
+srchadmin
+EWX
+dlgtext
+CMD
+appref-ms
+appref
+TSource
+runas
+dpi
+popup
+ptr
+pluginindicator
+TobiasSekan
+Img
+img
+resx
+bak
+tmp
+directx
+mvvm
+dlg
+ddd
+dddd
+clearlogfolder
+ACCENT_ENABLE_TRANSPARENTGRADIENT
+ACCENT_ENABLE_BLURBEHIND
+WCA_ACCENT_POLICY
+HGlobal
+dopusrt
+firefox
+msedge
+svgc
+ime
+zindex
+txb
+btn
+otf
+searchplugin
+Noresult
+wpftk
+mkv
+flac
diff --git a/.github/actions/spelling/line_forbidden.patterns b/.github/actions/spelling/line_forbidden.patterns
new file mode 100644
index 000000000..7341d9b73
--- /dev/null
+++ b/.github/actions/spelling/line_forbidden.patterns
@@ -0,0 +1,62 @@
+# reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere
+# \bm_data\b
+
+# If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
+# you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want
+# to use this:
+#\bfit\(
+
+# s.b. GitHub
+#\bGithub\b
+
+# s.b. GitLab
+\bGitlab\b
+
+# s.b. JavaScript
+\bJavascript\b
+
+# s.b. Microsoft
+\bMicroSoft\b
+
+# s.b. another
+\ban[- ]other\b
+
+# s.b. greater than
+\bgreater then\b
+
+# s.b. into
+\sin to\s
+
+# s.b. opt-in
+\sopt in\s
+
+# s.b. less than
+\bless then\b
+
+# s.b. otherwise
+\bother[- ]wise\b
+
+# s.b. nonexistent
+\bnon existing\b
+\b[Nn]o[nt][- ]existent\b
+
+# s.b. preexisting
+[Pp]re[- ]existing
+
+# s.b. preempt
+[Pp]re[- ]empt\b
+
+# s.b. preemptively
+[Pp]re[- ]emptively
+
+# s.b. reentrancy
+[Rr]e[- ]entrancy
+
+# s.b. reentrant
+[Rr]e[- ]entrant
+
+# s.b. workaround(s)
+\bwork[- ]arounds?\b
+
+# Reject duplicate words
+\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
new file mode 100644
index 000000000..2f4ff418d
--- /dev/null
+++ b/.github/actions/spelling/patterns.txt
@@ -0,0 +1,117 @@
+# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
+
+# Questionably acceptable forms of `in to`
+# Personally, I prefer `log into`, but people object
+# https://www.tprteaching.com/log-into-log-in-to-login/
+\b[Ll]og in to\b
+
+# acceptable duplicates
+# ls directory listings
+[-bcdlpsw](?:[-r][-w][-sx]){3}\s+\d+\s+(\S+)\s+\g{-1}\s+\d+\s+
+# C types and repeated CSS values
+\s(center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?: \g{-1})+\s
+# go templates
+\s(\w+)\s+\g{-1}\s+\`(?:graphql|json|yaml):
+# javadoc / .net
+(?:[\\@](?:groupname|param)|(?:public|private)(?:\s+static|\s+readonly)*)\s+(\w+)\s+\g{-1}\s
+
+# Commit message -- Signed-off-by and friends
+^\s*(?:(?:Based-on-patch|Co-authored|Helped|Mentored|Reported|Reviewed|Signed-off)-by|Thanks-to): (?:[^<]*<[^>]*>|[^<]*)\s*$
+
+# Autogenerated revert commit message
+^This reverts commit [0-9a-f]{40}\.$
+
+# ignore long runs of a single character:
+\b([A-Za-z])\g{-1}{3,}\b
+
+# Automatically suggested patterns
+# hit-count: 360 file-count: 108
+# IServiceProvider
+\bI(?=(?:[A-Z][a-z]{2,})+\b)
+
+# hit-count: 297 file-count: 18
+# uuid:
+\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
+
+# hit-count: 138 file-count: 27
+# hex digits including css/html color classes:
+(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|u\d+)\b
+
+# hit-count: 93 file-count: 28
+# hex runs
+\b[0-9a-fA-F]{16,}\b
+
+# hit-count: 52 file-count: 3
+# githubusercontent
+/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]*
+
+/[-a-z0-9]+\.github\.com/[-a-zA-Z0-9?&=_\/.]*
+
+# hit-count: 24 file-count: 12
+# GitHub SHAs (markdown)
+(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)
+
+# hit-count: 11 file-count: 10
+# stackexchange -- https://stackexchange.com/feeds/sites
+\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/)
+
+# hit-count: 11 file-count: 8
+# microsoft
+\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]*
+
+# hit-count: 2 file-count: 2
+# Twitter status
+\btwitter\.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)
+
+# hit-count: 2 file-count: 1
+# discord
+/discord(?:app\.com|\.gg)/(?:invite/)?[a-zA-Z0-9]{7,}
+
+# hit-count: 1 file-count: 1
+# appveyor api
+\bci\.appveyor\.com/api/projects/status/[0-9a-z]+
+
+# hit-count: 1 file-count: 1
+# gist github
+\bgist\.github\.com/[^/\s"]+/[0-9a-f]+
+
+# Automatically suggested patterns
+# hit-count: 21 file-count: 21
+# w3
+\bw3\.org/[-0-9a-zA-Z/#.]+
+
+# hit-count: 6 file-count: 1
+# shields.io
+\bshields\.io/[-\w/%?=&.:+;,]*
+
+# hit-count: 3 file-count: 2
+# While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there
+# YouTube url
+\b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]*
+
+# hit-count: 2 file-count: 2
+# Google Maps
+\bmaps\.google\.com/maps\?[\w&;=]*
+
+# hit-count: 2 file-count: 2
+# Contributor
+\[[^\]]+\]\(https://github\.com/[^/\s"]+\)
+
+# hit-count: 2 file-count: 1
+# URL escaped characters
+\%[0-9A-F][A-F]
+
+# hit-count: 1 file-count: 1
+# Compiler flags
+(?:^|[\t ,"'`=(])-[DPWXYLlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
+
+# Localization keys
+#x:Key="[^"]+"
+#{DynamicResource [^"]+}
+
+# html tag
+<\w+[^>]*>
+\w+[^>]*>
+
+#http/https
+(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
diff --git a/.github/actions/spelling/reject.txt b/.github/actions/spelling/reject.txt
new file mode 100644
index 000000000..b5a6d3680
--- /dev/null
+++ b/.github/actions/spelling/reject.txt
@@ -0,0 +1,10 @@
+^attache$
+benefitting
+occurences?
+^dependan.*
+^oer$
+Sorce
+^[Ss]pae.*
+^untill$
+^untilling$
+^wether.*
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..d9b39eb89
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,21 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "nuget" # See documentation for possible values
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "weekly"
+ ignore:
+ - dependency-name: "squirrel-windows"
+ reviewers:
+ - "jjw24"
+ - "taooceros"
+ - "JohnTheGr8"
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
new file mode 100644
index 000000000..df962a675
--- /dev/null
+++ b/.github/workflows/spelling.yml
@@ -0,0 +1,160 @@
+name: Check Spelling
+
+# Comment management is handled through a secondary job, for details see:
+# https://github.com/check-spelling/check-spelling/wiki/Feature%3A-Restricted-Permissions
+#
+# `jobs.comment-push` runs when a push is made to a repository and the `jobs.spelling` job needs to make a comment
+# (in odd cases, it might actually run just to collapse a comment, but that's fairly rare)
+# it needs `contents: write` in order to add a comment.
+#
+# `jobs.comment-pr` runs when a pull_request is made to a repository and the `jobs.spelling` job needs to make a comment
+# or collapse a comment (in the case where it had previously made a comment and now no longer needs to show a comment)
+# it needs `pull-requests: write` in order to manipulate those comments.
+
+# Updating pull request branches is managed via comment handling.
+# For details, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-expect-list
+#
+# These elements work together to make it happen:
+#
+# `on.issue_comment`
+# This event listens to comments by users asking to update the metadata.
+#
+# `jobs.update`
+# This job runs in response to an issue_comment and will push a new commit
+# to update the spelling metadata.
+#
+# `with.experimental_apply_changes_via_bot`
+# Tells the action to support and generate messages that enable it
+# to make a commit to update the spelling metadata.
+#
+# `with.ssh_key`
+# In order to trigger workflows when the commit is made, you can provide a
+# secret (typically, a write-enabled github deploy key).
+#
+# For background, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-with-deploy-key
+
+on:
+# push:
+# branches:
+# - '**'
+# - '!l10n_dev'
+# tags-ignore:
+# - "**"
+ pull_request_target:
+ branches:
+ - '**'
+ # - '!l10n_dev'
+ tags-ignore:
+ - "**"
+ types:
+ - 'opened'
+ - 'reopened'
+ - 'synchronize'
+ # issue_comment:
+ # types:
+ # - 'created'
+
+jobs:
+ spelling:
+ name: Check Spelling
+ permissions:
+ contents: read
+ pull-requests: read
+ actions: read
+ security-events: write
+ outputs:
+ followup: ${{ steps.spelling.outputs.followup }}
+ runs-on: ubuntu-latest
+ if: (contains(github.event_name, 'pull_request') && github.head_ref != 'l10n_dev')
+ concurrency:
+ group: spelling-${{ github.event.pull_request.number || github.ref }}
+ # note: If you use only_check_changed_files, you do not want cancel-in-progress
+ cancel-in-progress: false
+ steps:
+ - name: check-spelling
+ id: spelling
+ uses: check-spelling/check-spelling@main
+ with:
+ suppress_push_for_open_pull_request: 1
+ checkout: true
+ check_file_names: 1
+ spell_check_this: check-spelling/spell-check-this@main
+ post_comment: 0
+ use_magic_file: 1
+ experimental_apply_changes_via_bot: 1
+ use_sarif: 0 # to show in pr page
+ extra_dictionary_limit: 10
+ check_commit_messages: commits title description
+ only_check_changed_files: 1
+ check_extra_dictionaries: ''
+ quit_without_error: true
+ extra_dictionaries:
+ cspell:software-terms/src/software-terms.txt
+ cspell:win32/src/win32.txt
+ cspell:php/php.txt
+ cspell:filetypes/filetypes.txt
+ cspell:csharp/csharp.txt
+ cspell:dotnet/dotnet.txt
+ cspell:python/src/python/python-lib.txt
+ cspell:aws/aws.txt
+ cspell:companies/src/companies.txt
+ warnings:
+ binary-file,deprecated-feature,large-file,limited-references,noisy-file,non-alpha-in-dictionary,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,unrecognized-spelling,no-newline-at-eof
+
+
+
+# comment-push:
+# name: Report (Push)
+# # If your workflow isn't running on push, you can remove this job
+# runs-on: ubuntu-latest
+# needs: spelling
+# permissions:
+# contents: write
+# if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
+# steps:
+# - name: comment
+# uses: check-spelling/check-spelling@main
+# with:
+# checkout: true
+# spell_check_this: check-spelling/spell-check-this@main
+# task: ${{ needs.spelling.outputs.followup }}
+
+ comment-pr:
+ name: Report (PR)
+ # If you workflow isn't running on pull_request*, you can remove this job
+ runs-on: ubuntu-latest
+ needs: spelling
+ permissions:
+ pull-requests: write
+ if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
+ steps:
+ - name: comment
+ uses: check-spelling/check-spelling@main
+ with:
+ checkout: true
+ spell_check_this: check-spelling/spell-check-this@main
+ task: ${{ needs.spelling.outputs.followup }}
+ experimental_apply_changes_via_bot: 1
+
+ # update:
+ # name: Update PR
+ # permissions:
+ # contents: write
+ # pull-requests: write
+ # actions: read
+ # runs-on: ubuntu-latest
+ # if: ${{
+ # github.event_name == 'issue_comment' &&
+ # github.event.issue.pull_request &&
+ # contains(github.event.comment.body, '@check-spelling-bot apply')
+ # }}
+ # concurrency:
+ # group: spelling-update-${{ github.event.issue.number }}
+ # cancel-in-progress: false
+ # steps:
+ # - name: apply spelling updates
+ # uses: check-spelling/check-spelling@main
+ # with:
+ # experimental_apply_changes_via_bot: 1
+ # checkout: true
+ # ssh_key: "${{ secrets.CHECK_SPELLING }}"
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 000000000..caac10c93
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,26 @@
+# For more information, see:
+# https://github.com/actions/stale
+name: Mark stale issues and pull requests
+
+on:
+ schedule:
+ - cron: '30 1 * * *'
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/stale@v8
+ with:
+ stale-issue-message: 'This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
+ days-before-stale: 45
+ days-before-close: 7
+ days-before-pr-close: -1
+ exempt-all-milestones: true
+ close-issue-message: 'This issue was closed because it has been stale for 7 days with no activity. If you feel this issue still needs attention please feel free to reopen.'
+ stale-pr-label: 'no-pr-activity'
+ exempt-issue-labels: 'keep-fresh'
+ exempt-pr-labels: 'keep-fresh,awaiting-approval,work-in-progress'
diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml
new file mode 100644
index 000000000..b1d289091
--- /dev/null
+++ b/.github/workflows/winget.yml
@@ -0,0 +1,15 @@
+name: Publish to Winget
+
+on:
+ release:
+ types: [released]
+
+jobs:
+ publish:
+ # Action can only be run on windows
+ runs-on: windows-latest
+ steps:
+ - uses: vedantmgoyal2009/winget-releaser@v2
+ with:
+ identifier: Flow-Launcher.Flow-Launcher
+ token: ${{ secrets.WINGET_TOKEN }}
diff --git a/Flow.Launcher.Core/Configuration/Portable.cs b/Flow.Launcher.Core/Configuration/Portable.cs
index 5bca087b8..b58154dcb 100644
--- a/Flow.Launcher.Core/Configuration/Portable.cs
+++ b/Flow.Launcher.Core/Configuration/Portable.cs
@@ -1,4 +1,4 @@
-using Microsoft.Win32;
+using Microsoft.Win32;
using Squirrel;
using System;
using System.IO;
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Configuration
}
catch (Exception e)
{
- Log.Exception("|Portable.DisablePortableMode|Error occured while disabling portable mode", e);
+ Log.Exception("|Portable.DisablePortableMode|Error occurred while disabling portable mode", e);
}
}
@@ -71,7 +71,7 @@ namespace Flow.Launcher.Core.Configuration
}
catch (Exception e)
{
- Log.Exception("|Portable.EnablePortableMode|Error occured while enabling portable mode", e);
+ Log.Exception("|Portable.EnablePortableMode|Error occurred while enabling portable mode", e);
}
}
@@ -127,7 +127,7 @@ namespace Flow.Launcher.Core.Configuration
using (var portabilityUpdater = NewUpdateManager())
{
- portabilityUpdater.CreateUninstallerRegistryEntry();
+ _ = portabilityUpdater.CreateUninstallerRegistryEntry();
}
}
@@ -187,7 +187,7 @@ namespace Flow.Launcher.Core.Configuration
if (roamingLocationExists && portableLocationExists)
{
MessageBox.Show(string.Format("Flow Launcher detected your user data exists both in {0} and " +
- "{1}. {2}{2}Please delete {1} in order to proceed. No changes have occured.",
+ "{1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.",
DataLocation.PortableDataPath, DataLocation.RoamingDataPath, Environment.NewLine));
return false;
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs
new file mode 100644
index 000000000..9ebacc942
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs
@@ -0,0 +1,234 @@
+using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.Plugin.SharedCommands;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+ public abstract class AbstractPluginEnvironment
+ {
+ internal abstract string Language { get; }
+
+ internal abstract string EnvName { get; }
+
+ internal abstract string EnvPath { get; }
+
+ internal abstract string InstallPath { get; }
+
+ internal abstract string ExecutablePath { get; }
+
+ internal virtual string FileDialogFilter => string.Empty;
+
+ internal abstract string PluginsSettingsFilePath { get; set; }
+
+ internal List PluginMetadataList;
+
+ internal PluginsSettings PluginSettings;
+
+ internal AbstractPluginEnvironment(List pluginMetadataList, PluginsSettings pluginSettings)
+ {
+ PluginMetadataList = pluginMetadataList;
+ PluginSettings = pluginSettings;
+ }
+
+ internal IEnumerable Setup()
+ {
+ if (!PluginMetadataList.Any(o => o.Language.Equals(Language, StringComparison.OrdinalIgnoreCase)))
+ return new List();
+
+ // TODO: Remove. This is backwards compatibility for 1.10.0 release- changed PythonEmbeded to Environments/Python
+ if (Language.Equals(AllowedLanguage.Python, StringComparison.OrdinalIgnoreCase))
+ {
+ FilesFolders.RemoveFolderIfExists(Path.Combine(DataLocation.DataDirectory(), "PythonEmbeddable"));
+
+ if (!string.IsNullOrEmpty(PluginSettings.PythonDirectory) && PluginSettings.PythonDirectory.StartsWith(Path.Combine(DataLocation.DataDirectory(), "PythonEmbeddable")))
+ {
+ InstallEnvironment();
+ PluginSettings.PythonDirectory = string.Empty;
+ }
+ }
+
+ if (!string.IsNullOrEmpty(PluginsSettingsFilePath) && FilesFolders.FileExists(PluginsSettingsFilePath))
+ {
+ // Ensure latest only if user is using Flow's environment setup.
+ if (PluginsSettingsFilePath.StartsWith(EnvPath, StringComparison.OrdinalIgnoreCase))
+ EnsureLatestInstalled(ExecutablePath, PluginsSettingsFilePath, EnvPath);
+
+ return SetPathForPluginPairs(PluginsSettingsFilePath, Language);
+ }
+
+ if (MessageBox.Show($"Flow detected you have installed {Language} plugins, which " +
+ $"will require {EnvName} to run. Would you like to download {EnvName}? " +
+ Environment.NewLine + Environment.NewLine +
+ "Click no if it's already installed, " +
+ $"and you will be prompted to select the folder that contains the {EnvName} executable",
+ string.Empty, MessageBoxButtons.YesNo) == DialogResult.No)
+ {
+ var msg = $"Please select the {EnvName} executable";
+ var selectedFile = string.Empty;
+
+ selectedFile = GetFileFromDialog(msg, FileDialogFilter);
+
+ if (!string.IsNullOrEmpty(selectedFile))
+ PluginsSettingsFilePath = selectedFile;
+
+ // Nothing selected because user pressed cancel from the file dialog window
+ if (string.IsNullOrEmpty(selectedFile))
+ InstallEnvironment();
+ }
+ else
+ {
+ InstallEnvironment();
+ }
+
+ if (FilesFolders.FileExists(PluginsSettingsFilePath))
+ {
+ return SetPathForPluginPairs(PluginsSettingsFilePath, Language);
+ }
+ else
+ {
+ MessageBox.Show(
+ $"Unable to set {Language} executable path, please try from Flow's settings (scroll down to the bottom).");
+ Log.Error("PluginsLoader",
+ $"Not able to successfully set {EnvName} path, setting's plugin executable path variable is still an empty string.",
+ $"{Language}Environment");
+
+ return new List();
+ }
+ }
+
+ internal abstract void InstallEnvironment();
+
+ private void EnsureLatestInstalled(string expectedPath, string currentPath, string installedDirPath)
+ {
+ if (expectedPath == currentPath)
+ return;
+
+ FilesFolders.RemoveFolderIfExists(installedDirPath);
+
+ InstallEnvironment();
+
+ }
+
+ internal abstract PluginPair CreatePluginPair(string filePath, PluginMetadata metadata);
+
+ private IEnumerable SetPathForPluginPairs(string filePath, string languageToSet)
+ {
+ var pluginPairs = new List();
+
+ foreach (var metadata in PluginMetadataList)
+ {
+ if (metadata.Language.Equals(languageToSet, StringComparison.OrdinalIgnoreCase))
+ pluginPairs.Add(CreatePluginPair(filePath, metadata));
+ }
+
+ return pluginPairs;
+ }
+
+ private string GetFileFromDialog(string title, string filter = "")
+ {
+ var dlg = new OpenFileDialog
+ {
+ InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
+ Multiselect = false,
+ CheckFileExists = true,
+ CheckPathExists = true,
+ Title = title,
+ Filter = filter
+ };
+
+ var result = dlg.ShowDialog();
+ if (result == DialogResult.OK)
+ {
+ return dlg.FileName;
+ }
+ else
+ {
+ return string.Empty;
+ }
+ }
+
+ ///
+ /// After app updated while in portable mode or switched between portable/roaming mode,
+ /// need to update each plugin's executable path so user will not be prompted again to reinstall the environments.
+ ///
+ ///
+ public static void PreStartPluginExecutablePathUpdate(Settings settings)
+ {
+ if (DataLocation.PortableDataLocationInUse())
+ {
+ // When user is using portable but has moved flow to a different location
+ if (IsUsingPortablePath(settings.PluginSettings.PythonExecutablePath, DataLocation.PythonEnvironmentName)
+ && !settings.PluginSettings.PythonExecutablePath.StartsWith(DataLocation.PortableDataPath))
+ {
+ settings.PluginSettings.PythonExecutablePath
+ = GetUpdatedEnvironmentPath(settings.PluginSettings.PythonExecutablePath);
+ }
+
+ if (IsUsingPortablePath(settings.PluginSettings.NodeExecutablePath, DataLocation.NodeEnvironmentName)
+ && !settings.PluginSettings.NodeExecutablePath.StartsWith(DataLocation.PortableDataPath))
+ {
+ settings.PluginSettings.NodeExecutablePath
+ = GetUpdatedEnvironmentPath(settings.PluginSettings.NodeExecutablePath);
+ }
+
+ // When user has switched from roaming to portable
+ if (IsUsingRoamingPath(settings.PluginSettings.PythonExecutablePath))
+ {
+ settings.PluginSettings.PythonExecutablePath
+ = settings.PluginSettings.PythonExecutablePath.Replace(DataLocation.RoamingDataPath, DataLocation.PortableDataPath);
+ }
+
+ if (IsUsingRoamingPath(settings.PluginSettings.NodeExecutablePath))
+ {
+ settings.PluginSettings.NodeExecutablePath
+ = settings.PluginSettings.NodeExecutablePath.Replace(DataLocation.RoamingDataPath, DataLocation.PortableDataPath);
+ }
+ }
+ else
+ {
+ if (IsUsingPortablePath(settings.PluginSettings.PythonExecutablePath, DataLocation.PythonEnvironmentName))
+ settings.PluginSettings.PythonExecutablePath
+ = GetUpdatedEnvironmentPath(settings.PluginSettings.PythonExecutablePath);
+
+ if (IsUsingPortablePath(settings.PluginSettings.NodeExecutablePath, DataLocation.NodeEnvironmentName))
+ settings.PluginSettings.NodeExecutablePath
+ = GetUpdatedEnvironmentPath(settings.PluginSettings.NodeExecutablePath);
+ }
+ }
+
+ private static bool IsUsingPortablePath(string filePath, string pluginEnvironmentName)
+ {
+ if (string.IsNullOrEmpty(filePath))
+ return false;
+
+ // DataLocation.PortableDataPath returns the current portable path, this determines if an out
+ // of date path is also a portable path.
+ var portableAppEnvLocation = $"UserData\\{DataLocation.PluginEnvironments}\\{pluginEnvironmentName}";
+
+ return filePath.Contains(portableAppEnvLocation);
+ }
+
+ private static bool IsUsingRoamingPath(string filePath)
+ {
+ if (string.IsNullOrEmpty(filePath))
+ return false;
+
+ return filePath.StartsWith(DataLocation.RoamingDataPath);
+ }
+
+ private static string GetUpdatedEnvironmentPath(string filePath)
+ {
+ var index = filePath.IndexOf(DataLocation.PluginEnvironments);
+
+ // get the substring after "Environments" because we can not determine it dynamically
+ var ExecutablePathSubstring = filePath.Substring(index + DataLocation.PluginEnvironments.Count());
+ return $"{DataLocation.PluginEnvironmentsPath}{ExecutablePathSubstring}";
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptEnvironment.cs
new file mode 100644
index 000000000..b67059b1b
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptEnvironment.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+
+ internal class JavaScriptEnvironment : TypeScriptEnvironment
+ {
+ internal override string Language => AllowedLanguage.JavaScript;
+
+ internal JavaScriptEnvironment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+ }
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs
new file mode 100644
index 000000000..55b3b60bd
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs
@@ -0,0 +1,48 @@
+using Droplex;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.Plugin.SharedCommands;
+using System.Collections.Generic;
+using System.IO;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+ internal class PythonEnvironment : AbstractPluginEnvironment
+ {
+ internal override string Language => AllowedLanguage.Python;
+
+ internal override string EnvName => DataLocation.PythonEnvironmentName;
+
+ internal override string EnvPath => Path.Combine(DataLocation.PluginEnvironmentsPath, EnvName);
+
+ internal override string InstallPath => Path.Combine(EnvPath, "PythonEmbeddable-v3.8.9");
+
+ internal override string ExecutablePath => Path.Combine(InstallPath, "pythonw.exe");
+
+ internal override string FileDialogFilter => "Python|pythonw.exe";
+
+ internal override string PluginsSettingsFilePath { get => PluginSettings.PythonExecutablePath; set => PluginSettings.PythonExecutablePath = value; }
+
+ internal PythonEnvironment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+
+ internal override void InstallEnvironment()
+ {
+ FilesFolders.RemoveFolderIfExists(InstallPath);
+
+ // Python 3.8.9 is used for Windows 7 compatibility
+ DroplexPackage.Drop(App.python_3_8_9_embeddable, InstallPath).Wait();
+
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+
+ internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
+ {
+ return new PluginPair
+ {
+ Plugin = new PythonPlugin(filePath),
+ Metadata = metadata
+ };
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs
new file mode 100644
index 000000000..70341f711
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs
@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+using Droplex;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin.SharedCommands;
+using Flow.Launcher.Plugin;
+using System.IO;
+using Flow.Launcher.Core.Plugin;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+ internal class TypeScriptEnvironment : AbstractPluginEnvironment
+ {
+ internal override string Language => AllowedLanguage.TypeScript;
+
+ internal override string EnvName => DataLocation.NodeEnvironmentName;
+
+ internal override string EnvPath => Path.Combine(DataLocation.PluginEnvironmentsPath, EnvName);
+
+ internal override string InstallPath => Path.Combine(EnvPath, "Node-v16.18.0");
+ internal override string ExecutablePath => Path.Combine(InstallPath, "node-v16.18.0-win-x64\\node.exe");
+
+ internal override string PluginsSettingsFilePath { get => PluginSettings.NodeExecutablePath; set => PluginSettings.NodeExecutablePath = value; }
+
+ internal TypeScriptEnvironment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+
+ internal override void InstallEnvironment()
+ {
+ FilesFolders.RemoveFolderIfExists(InstallPath);
+
+ DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath).Wait();
+
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+
+ internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
+ {
+ return new PluginPair
+ {
+ Plugin = new NodePlugin(filePath),
+ Metadata = metadata
+ };
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/FlowPluginException.cs b/Flow.Launcher.Core/ExternalPlugins/FlowPluginException.cs
new file mode 100644
index 000000000..47bc285c9
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/FlowPluginException.cs
@@ -0,0 +1,24 @@
+using Flow.Launcher.Plugin;
+using System;
+
+namespace Flow.Launcher.Core.ExternalPlugins
+{
+ public class FlowPluginException : Exception
+ {
+ public PluginMetadata Metadata { get; set; }
+
+ public FlowPluginException(PluginMetadata metadata, Exception e) : base(e.Message, e)
+ {
+ Metadata = metadata;
+ }
+
+ public override string ToString()
+ {
+ return $@"{Metadata.Name} Exception:
+Websites: {Metadata.Website}
+Author: {Metadata.Author}
+Version: {Metadata.Version}
+{base.ToString()}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
index fab1b3e8f..e3f0e2a2f 100644
--- a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
@@ -29,13 +29,13 @@ namespace Flow.Launcher.Core.ExternalPlugins
var request = new HttpRequestMessage(HttpMethod.Get, manifestFileUrl);
request.Headers.Add("If-None-Match", latestEtag);
- var response = await Http.SendAsync(request, token).ConfigureAwait(false);
+ using var response = await Http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false);
if (response.StatusCode == HttpStatusCode.OK)
{
Log.Info($"|PluginsManifest.{nameof(UpdateManifestAsync)}|Fetched plugins from manifest repo");
- var json = await response.Content.ReadAsStreamAsync(token).ConfigureAwait(false);
+ await using var json = await response.Content.ReadAsStreamAsync(token).ConfigureAwait(false);
UserPlugins = await JsonSerializer.DeserializeAsync>(json, cancellationToken: token).ConfigureAwait(false);
@@ -56,4 +56,4 @@ namespace Flow.Launcher.Core.ExternalPlugins
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
index f98815c1a..bb1279b2c 100644
--- a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs
@@ -1,4 +1,6 @@
-namespace Flow.Launcher.Core.ExternalPlugins
+using System;
+
+namespace Flow.Launcher.Core.ExternalPlugins
{
public record UserPlugin
{
@@ -12,5 +14,8 @@
public string UrlDownload { get; set; }
public string UrlSourceCode { get; set; }
public string IcoPath { get; set; }
+ public DateTime LatestReleaseDate { get; set; }
+ public DateTime DateAdded { get; set; }
+
}
}
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 60c4ec3de..4077320bc 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -1,7 +1,7 @@
- net5.0-windows
+ net7.0-windows
true
true
Library
@@ -53,10 +53,10 @@
-
-
-
-
+
+
+
+
diff --git a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
index 049d1c583..6b55bb3e3 100644
--- a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
+++ b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
@@ -9,7 +9,6 @@ namespace Flow.Launcher.Core.Plugin
internal class ExecutablePlugin : JsonRPCPlugin
{
private readonly ProcessStartInfo _startInfo;
- public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
public ExecutablePlugin(string filename)
{
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index cf75e4aa3..e937779a1 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -93,4 +93,4 @@ namespace Flow.Launcher.Core.Plugin
public Dictionary SettingsChange { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs b/Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs
index 1f63f85a8..6dc4be881 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCConfigurationModel.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
namespace Flow.Launcher.Core.Plugin
{
@@ -26,6 +27,8 @@ namespace Flow.Launcher.Core.Plugin
public string Name { get; set; }
public string Label { get; set; }
public string Description { get; set; }
+ public string urlLabel { get; set; }
+ public Uri url { get; set; }
public bool Validation { get; set; }
public List Options { get; set; }
public string DefaultValue { get; set; }
@@ -40,4 +43,4 @@ namespace Flow.Launcher.Core.Plugin
DefaultValue = this.DefaultValue;
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index 4cfa83382..f3b2eed87 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -1,33 +1,31 @@
-using Accessibility;
-using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Core.Resource;
using Flow.Launcher.Infrastructure;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Reflection;
+using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-using ICSharpCode.SharpZipLib.Zip;
-using JetBrains.Annotations;
using Microsoft.IO;
-using System.Text.Json.Serialization;
using System.Windows;
using System.Windows.Controls;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using CheckBox = System.Windows.Controls.CheckBox;
using Control = System.Windows.Controls.Control;
-using Label = System.Windows.Controls.Label;
using Orientation = System.Windows.Controls.Orientation;
using TextBox = System.Windows.Controls.TextBox;
using UserControl = System.Windows.Controls.UserControl;
-using System.Windows.Data;
+using System.Windows.Documents;
+using static System.Windows.Forms.LinkLabel;
+using Droplex;
+using System.Windows.Forms;
namespace Flow.Launcher.Core.Plugin
{
@@ -40,10 +38,6 @@ namespace Flow.Launcher.Core.Plugin
protected PluginInitContext context;
public const string JsonRPC = "JsonRPC";
- ///
- /// The language this JsonRPCPlugin support
- ///
- public abstract string SupportedLanguage { get; set; }
protected abstract Task RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
protected abstract string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
@@ -69,7 +63,13 @@ namespace Flow.Launcher.Core.Plugin
private static readonly JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true,
+#pragma warning disable SYSLIB0020
+ // IgnoreNullValues is obsolete, but the replacement JsonIgnoreCondition.WhenWritingNull still
+ // deserializes null, instead of ignoring it and leaving the default (empty list). We can change the behaviour
+ // to accept null and fallback to a default etc, or just keep IgnoreNullValues for now
+ // see: https://github.com/dotnet/runtime/issues/39152
IgnoreNullValues = true,
+#pragma warning restore SYSLIB0020 // Type or member is obsolete
Converters =
{
new JsonObjectConverter()
@@ -82,16 +82,19 @@ namespace Flow.Launcher.Core.Plugin
};
private Dictionary Settings { get; set; }
- private Dictionary _settingControls = new();
+ private readonly Dictionary _settingControls = new();
private async Task> DeserializedResultAsync(Stream output)
{
- if (output == Stream.Null) return null;
+ await using (output)
+ {
+ if (output == Stream.Null) return null;
- var queryResponseModel =
- await JsonSerializer.DeserializeAsync(output, options);
+ var queryResponseModel =
+ await JsonSerializer.DeserializeAsync(output, options);
- return ParseResults(queryResponseModel);
+ return ParseResults(queryResponseModel);
+ }
}
private List DeserializedResult(string output)
@@ -115,7 +118,7 @@ namespace Flow.Launcher.Core.Plugin
foreach (var result in queryResponseModel.Result)
{
- result.Action = c =>
+ result.AsyncAction = async c =>
{
UpdateSettings(result.SettingsChange);
@@ -133,15 +136,15 @@ namespace Flow.Launcher.Core.Plugin
}
else
{
- var actionResponse = Request(result.JsonRPCAction);
+ await using var actionResponse = await RequestAsync(result.JsonRPCAction);
- if (string.IsNullOrEmpty(actionResponse))
+ if (actionResponse.Length == 0)
{
return !result.JsonRPCAction.DontHideAfterAction;
}
- var jsonRpcRequestModel =
- JsonSerializer.Deserialize(actionResponse, options);
+ var jsonRpcRequestModel = await
+ JsonSerializer.DeserializeAsync(actionResponse, options);
if (jsonRpcRequestModel?.Method?.StartsWith("Flow.Launcher.") ?? false)
{
@@ -166,19 +169,20 @@ namespace Flow.Launcher.Core.Plugin
private void ExecuteFlowLauncherAPI(string method, object[] parameters)
{
var parametersTypeArray = parameters.Select(param => param.GetType()).ToArray();
- MethodInfo methodInfo = PluginManager.API.GetType().GetMethod(method, parametersTypeArray);
- if (methodInfo != null)
+ var methodInfo = typeof(IPublicAPI).GetMethod(method, parametersTypeArray);
+ if (methodInfo == null)
+ {
+ return;
+ }
+ try
+ {
+ methodInfo.Invoke(PluginManager.API, parameters);
+ }
+ catch (Exception)
{
- try
- {
- methodInfo.Invoke(PluginManager.API, parameters);
- }
- catch (Exception)
- {
#if (DEBUG)
- throw;
+ throw;
#endif
- }
}
}
@@ -240,73 +244,62 @@ namespace Flow.Launcher.Core.Plugin
protected async Task ExecuteAsync(ProcessStartInfo startInfo, CancellationToken token = default)
{
- Process process = null;
- bool disposed = false;
- try
+ using var process = Process.Start(startInfo);
+ if (process == null)
{
- process = Process.Start(startInfo);
- if (process == null)
- {
- Log.Error("|JsonRPCPlugin.ExecuteAsync|Can't start new process");
- return Stream.Null;
- }
+ Log.Error("|JsonRPCPlugin.ExecuteAsync|Can't start new process");
+ return Stream.Null;
+ }
- await using var source = process.StandardOutput.BaseStream;
+ var sourceBuffer = BufferManager.GetStream();
+ using var errorBuffer = BufferManager.GetStream();
- var buffer = BufferManager.GetStream();
-
- token.Register(() =>
- {
- // ReSharper disable once AccessToModifiedClosure
- // Manually Check whether disposed
- if (!disposed && !process.HasExited)
- process.Kill();
- });
+ var sourceCopyTask = process.StandardOutput.BaseStream.CopyToAsync(sourceBuffer, token);
+ var errorCopyTask = process.StandardError.BaseStream.CopyToAsync(errorBuffer, token);
+ await using var registeredEvent = token.Register(() =>
+ {
try
{
- // token expire won't instantly trigger the exception,
- // manually kill process at before
- await source.CopyToAsync(buffer, token);
+ if (!process.HasExited)
+ process.Kill();
+ sourceBuffer.Dispose();
}
- catch (OperationCanceledException)
+ catch (Exception e)
{
- await buffer.DisposeAsync();
- return Stream.Null;
+ Log.Exception("|JsonRPCPlugin.ExecuteAsync|Exception when kill process", e);
}
+ });
- buffer.Seek(0, SeekOrigin.Begin);
-
- token.ThrowIfCancellationRequested();
-
- if (buffer.Length == 0)
- {
- var errorMessage = process.StandardError.EndOfStream ?
- "Empty JSONRPC Response" :
- await process.StandardError.ReadToEndAsync();
- throw new InvalidDataException($"{context.CurrentPluginMetadata.Name}|{errorMessage}");
- }
-
- if (!process.StandardError.EndOfStream)
- {
- using var standardError = process.StandardError;
- var error = await standardError.ReadToEndAsync();
-
- if (!string.IsNullOrEmpty(error))
- {
- Log.Error($"|{context.CurrentPluginMetadata.Name}.{nameof(ExecuteAsync)}|{error}");
- }
- }
-
- return buffer;
- }
- finally
+ try
{
- process?.Dispose();
- disposed = true;
+ // token expire won't instantly trigger the exception,
+ // manually kill process at before
+ await process.WaitForExitAsync(token);
+ await Task.WhenAll(sourceCopyTask, errorCopyTask);
}
+ catch (OperationCanceledException)
+ {
+ await sourceBuffer.DisposeAsync();
+ return Stream.Null;
+ }
+
+ switch (sourceBuffer.Length, errorBuffer.Length)
+ {
+ case (0, 0):
+ const string errorMessage = "Empty JSON-RPC Response.";
+ Log.Warn($"|{nameof(JsonRPCPlugin)}.{nameof(ExecuteAsync)}|{errorMessage}");
+ break;
+ case (_, not 0):
+ throw new InvalidDataException(Encoding.UTF8.GetString(errorBuffer.ToArray())); // The process has exited with an error message
+ }
+
+ sourceBuffer.Seek(0, SeekOrigin.Begin);
+
+ return sourceBuffer;
}
+
public async Task> QueryAsync(Query query, CancellationToken token)
{
var request = new JsonRPCRequestModel
@@ -354,126 +347,242 @@ namespace Flow.Launcher.Core.Plugin
this.context = context;
await InitSettingAsync();
}
- private static readonly Thickness settingControlMargin = new(10, 4, 10, 4);
- private static readonly Thickness settingPanelMargin = new(15, 20, 15, 20);
- private static readonly Thickness settingTextBlockMargin = new(10, 4, 10, 4);
+ private static readonly Thickness settingControlMargin = new(0, 9, 18, 9);
+ private static readonly Thickness settingCheckboxMargin = new(0, 9, 9, 9);
+ private static readonly Thickness settingPanelMargin = new(0, 0, 0, 0);
+ private static readonly Thickness settingTextBlockMargin = new(70, 9, 18, 9);
+ private static readonly Thickness settingLabelPanelMargin = new(70, 9, 18, 9);
+ private static readonly Thickness settingLabelMargin = new(0, 0, 0, 0);
+ private static readonly Thickness settingDescMargin = new(0, 2, 0, 0);
+ private static readonly Thickness settingSepMargin = new(0, 0, 0, 2);
private JsonRpcConfigurationModel _settingsTemplate;
+
public Control CreateSettingPanel()
{
if (Settings == null)
return new();
var settingWindow = new UserControl();
- var mainPanel = new StackPanel
+ var mainPanel = new Grid
{
- Margin = settingPanelMargin,
- Orientation = Orientation.Vertical
+ Margin = settingPanelMargin, VerticalAlignment = VerticalAlignment.Center
};
- settingWindow.Content = mainPanel;
+ ColumnDefinition gridCol1 = new ColumnDefinition();
+ ColumnDefinition gridCol2 = new ColumnDefinition();
+ gridCol1.Width = new GridLength(70, GridUnitType.Star);
+ gridCol2.Width = new GridLength(30, GridUnitType.Star);
+ mainPanel.ColumnDefinitions.Add(gridCol1);
+ mainPanel.ColumnDefinitions.Add(gridCol2);
+ settingWindow.Content = mainPanel;
+ int rowCount = 0;
foreach (var (type, attribute) in _settingsTemplate.Body)
{
+ Separator sep = new Separator();
+ sep.VerticalAlignment = VerticalAlignment.Top;
+ sep.Margin = settingSepMargin;
+ sep.SetResourceReference(Separator.BackgroundProperty, "Color03B"); /* for theme change */
var panel = new StackPanel
{
- Orientation = Orientation.Horizontal,
- Margin = settingControlMargin
+ Orientation = Orientation.Vertical,
+ VerticalAlignment = VerticalAlignment.Center,
+ Margin = settingLabelPanelMargin
};
+ RowDefinition gridRow = new RowDefinition();
+ mainPanel.RowDefinitions.Add(gridRow);
var name = new TextBlock()
{
Text = attribute.Label,
- Width = 120,
VerticalAlignment = VerticalAlignment.Center,
- Margin = settingControlMargin,
+ Margin = settingLabelMargin,
TextWrapping = TextWrapping.WrapWithOverflow
};
+ var desc = new TextBlock()
+ {
+ Text = attribute.Description,
+ FontSize = 12,
+ VerticalAlignment = VerticalAlignment.Center,
+ Margin = settingDescMargin,
+ TextWrapping = TextWrapping.WrapWithOverflow
+ };
+ desc.SetResourceReference(TextBlock.ForegroundProperty, "Color04B");
+
+ if (attribute.Description == null) /* if no description, hide */
+ desc.Visibility = Visibility.Collapsed;
+
+
+ if (type != "textBlock") /* if textBlock, hide desc */
+ {
+ panel.Children.Add(name);
+ panel.Children.Add(desc);
+ }
+
+
+ Grid.SetColumn(panel, 0);
+ Grid.SetRow(panel, rowCount);
FrameworkElement contentControl;
switch (type)
{
case "textBlock":
+ {
+ contentControl = new TextBlock
{
- contentControl = new TextBlock
- {
- Text = attribute.Description.Replace("\\r\\n", "\r\n"),
- Margin = settingTextBlockMargin,
- MaxWidth = 500,
- TextWrapping = TextWrapping.WrapWithOverflow
- };
- break;
- }
+ Text = attribute.Description.Replace("\\r\\n", "\r\n"),
+ Margin = settingTextBlockMargin,
+ Padding = new Thickness(0, 0, 0, 0),
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Left,
+ TextAlignment = TextAlignment.Left,
+ TextWrapping = TextWrapping.Wrap
+ };
+ Grid.SetColumn(contentControl, 0);
+ Grid.SetColumnSpan(contentControl, 2);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
case "input":
+ {
+ var textBox = new TextBox()
{
- var textBox = new TextBox()
- {
- Width = 300,
- Text = Settings[attribute.Name] as string ?? string.Empty,
- Margin = settingControlMargin,
- ToolTip = attribute.Description
- };
- textBox.TextChanged += (_, _) =>
- {
- Settings[attribute.Name] = textBox.Text;
- };
- contentControl = textBox;
- break;
- }
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ Margin = settingControlMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+ textBox.TextChanged += (_, _) =>
+ {
+ Settings[attribute.Name] = textBox.Text;
+ };
+ contentControl = textBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
+ case "inputWithFileBtn":
+ {
+ var textBox = new TextBox()
+ {
+ Margin = new Thickness(10, 0, 0, 0),
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+ textBox.TextChanged += (_, _) =>
+ {
+ Settings[attribute.Name] = textBox.Text;
+ };
+ var Btn = new System.Windows.Controls.Button()
+ {
+ Margin = new Thickness(10, 0, 0, 0), Content = "Browse"
+ };
+ var dockPanel = new DockPanel()
+ {
+ Margin = settingControlMargin
+ };
+ DockPanel.SetDock(Btn, Dock.Right);
+ dockPanel.Children.Add(Btn);
+ dockPanel.Children.Add(textBox);
+ contentControl = dockPanel;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
case "textarea":
+ {
+ var textBox = new TextBox()
{
- var textBox = new TextBox()
- {
- Width = 300,
- Height = 120,
- Margin = settingControlMargin,
- TextWrapping = TextWrapping.WrapWithOverflow,
- AcceptsReturn = true,
- Text = Settings[attribute.Name] as string ?? string.Empty,
- ToolTip = attribute.Description
- };
- textBox.TextChanged += (sender, _) =>
- {
- Settings[attribute.Name] = ((TextBox)sender).Text;
- };
- contentControl = textBox;
- break;
- }
+ Height = 120,
+ Margin = settingControlMargin,
+ VerticalAlignment = VerticalAlignment.Center,
+ TextWrapping = TextWrapping.WrapWithOverflow,
+ AcceptsReturn = true,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ ToolTip = attribute.Description
+ };
+ textBox.TextChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = ((TextBox)sender).Text;
+ };
+ contentControl = textBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
case "passwordBox":
+ {
+ var passwordBox = new PasswordBox()
{
- var passwordBox = new PasswordBox()
- {
- Width = 300,
- Margin = settingControlMargin,
- Password = Settings[attribute.Name] as string ?? string.Empty,
- PasswordChar = attribute.passwordChar == default ? '*' : attribute.passwordChar,
- ToolTip = attribute.Description
- };
- passwordBox.PasswordChanged += (sender, _) =>
- {
- Settings[attribute.Name] = ((PasswordBox)sender).Password;
- };
- contentControl = passwordBox;
- break;
- }
+ Margin = settingControlMargin,
+ Password = Settings[attribute.Name] as string ?? string.Empty,
+ PasswordChar = attribute.passwordChar == default ? '*' : attribute.passwordChar,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+ passwordBox.PasswordChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = ((PasswordBox)sender).Password;
+ };
+ contentControl = passwordBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
case "dropdown":
+ {
+ var comboBox = new System.Windows.Controls.ComboBox()
{
- var comboBox = new ComboBox()
- {
- ItemsSource = attribute.Options,
- SelectedItem = Settings[attribute.Name],
- Margin = settingControlMargin,
- ToolTip = attribute.Description
- };
- comboBox.SelectionChanged += (sender, _) =>
- {
- Settings[attribute.Name] = (string)((ComboBox)sender).SelectedItem;
- };
- contentControl = comboBox;
- break;
- }
+ ItemsSource = attribute.Options,
+ SelectedItem = Settings[attribute.Name],
+ Margin = settingControlMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
+ ToolTip = attribute.Description
+ };
+ comboBox.SelectionChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = (string)((System.Windows.Controls.ComboBox)sender).SelectedItem;
+ };
+ contentControl = comboBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ }
case "checkbox":
var checkBox = new CheckBox
{
IsChecked = Settings[attribute.Name] is bool isChecked ? isChecked : bool.Parse(attribute.DefaultValue),
- Margin = settingControlMargin,
+ Margin = settingCheckboxMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
ToolTip = attribute.Description
};
checkBox.Click += (sender, _) =>
@@ -481,18 +590,47 @@ namespace Flow.Launcher.Core.Plugin
Settings[attribute.Name] = ((CheckBox)sender).IsChecked;
};
contentControl = checkBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+ break;
+ case "hyperlink":
+ var hyperlink = new Hyperlink
+ {
+ ToolTip = attribute.Description, NavigateUri = attribute.url
+ };
+ var linkbtn = new System.Windows.Controls.Button
+ {
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = settingControlMargin
+ };
+ linkbtn.Content = attribute.urlLabel;
+
+ contentControl = linkbtn;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
break;
default:
continue;
}
if (type != "textBlock")
_settingControls[attribute.Name] = contentControl;
- panel.Children.Add(name);
- panel.Children.Add(contentControl);
mainPanel.Children.Add(panel);
+ mainPanel.Children.Add(contentControl);
+ rowCount++;
+
}
return settingWindow;
}
+
public void Save()
{
if (Settings != null)
@@ -524,7 +662,7 @@ namespace Flow.Launcher.Core.Plugin
case PasswordBox passwordBox:
passwordBox.Dispatcher.Invoke(() => passwordBox.Password = value as string);
break;
- case ComboBox comboBox:
+ case System.Windows.Controls.ComboBox comboBox:
comboBox.Dispatcher.Invoke(() => comboBox.SelectedItem = value);
break;
case CheckBox checkBox:
@@ -535,4 +673,5 @@ namespace Flow.Launcher.Core.Plugin
}
}
}
-}
\ No newline at end of file
+
+}
diff --git a/Flow.Launcher.Core/Plugin/NodePlugin.cs b/Flow.Launcher.Core/Plugin/NodePlugin.cs
new file mode 100644
index 000000000..1247143fa
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/NodePlugin.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ ///
+ /// Execution of JavaScript & TypeScript plugins
+ ///
+ internal class NodePlugin : JsonRPCPlugin
+ {
+ private readonly ProcessStartInfo _startInfo;
+
+ public NodePlugin(string filename)
+ {
+ _startInfo = new ProcessStartInfo
+ {
+ FileName = filename,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true
+ };
+ }
+
+ protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
+ {
+ _startInfo.ArgumentList[1] = request.ToString();
+ return ExecuteAsync(_startInfo, token);
+ }
+
+ protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
+ {
+ // since this is not static, request strings will build up in ArgumentList if index is not specified
+ _startInfo.ArgumentList[1] = rpcRequest.ToString();
+ return Execute(_startInfo);
+ }
+
+ public override async Task InitAsync(PluginInitContext context)
+ {
+ _startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
+ _startInfo.ArgumentList.Add(string.Empty);
+ await base.InitAsync(context);
+ _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
index 515b0bedc..9d76b6be0 100644
--- a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
@@ -15,20 +15,6 @@ namespace Flow.Launcher.Core.Plugin
private readonly AssemblyName assemblyName;
- private static readonly ConcurrentDictionary loadedAssembly;
-
- static PluginAssemblyLoader()
- {
- var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies();
- loadedAssembly = new ConcurrentDictionary(
- currentAssemblies.Select(x => new KeyValuePair(x.FullName, default)));
-
- AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
- {
- loadedAssembly[args.LoadedAssembly.FullName] = default;
- };
- }
-
internal PluginAssemblyLoader(string assemblyFilePath)
{
dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath);
@@ -47,10 +33,9 @@ namespace Flow.Launcher.Core.Plugin
// When resolving dependencies, ignore assembly depenedencies that already exits with Flow.Launcher
// Otherwise duplicate assembly will be loaded and some weird behavior will occur, such as WinRT.Runtime.dll
// will fail due to loading multiple versions in process, each with their own static instance of registration state
- if (assemblyPath == null || ExistsInReferencedPackage(assemblyName))
- return null;
+ var existAssembly = Default.Assemblies.FirstOrDefault(x => x.FullName == assemblyName.FullName);
- return LoadFromAssemblyPath(assemblyPath);
+ return existAssembly ?? (assemblyPath == null ? null : LoadFromAssemblyPath(assemblyPath));
}
internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type)
@@ -58,10 +43,5 @@ namespace Flow.Launcher.Core.Plugin
var allTypes = assembly.ExportedTypes;
return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Any(t => t == type));
}
-
- internal bool ExistsInReferencedPackage(AssemblyName assemblyName)
- {
- return loadedAssembly.ContainsKey(assemblyName.FullName);
- }
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 134c3c002..3b4a6e445 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -1,4 +1,5 @@
-using System;
+using Flow.Launcher.Core.ExternalPlugins;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
@@ -74,7 +75,7 @@ namespace Flow.Launcher.Core.Plugin
}
}
- public static async Task ReloadData()
+ public static async Task ReloadDataAsync()
{
await Task.WhenAll(AllPlugins.Select(plugin => plugin.Plugin switch
{
@@ -109,7 +110,7 @@ namespace Flow.Launcher.Core.Plugin
/// Call initialize for all plugins
///
/// return the list of failed to init plugins or null for none
- public static async Task InitializePlugins(IPublicAPI api)
+ public static async Task InitializePluginsAsync(IPublicAPI api)
{
API = api;
var failedPlugins = new ConcurrentQueue();
@@ -165,30 +166,28 @@ namespace Flow.Launcher.Core.Plugin
public static ICollection ValidPluginsForQuery(Query query)
{
- if (NonGlobalPlugins.ContainsKey(query.ActionKeyword))
- {
- var plugin = NonGlobalPlugins[query.ActionKeyword];
- return new List
- {
- plugin
- };
- }
- else
- {
+ if (query is null)
+ return Array.Empty();
+
+ if (!NonGlobalPlugins.ContainsKey(query.ActionKeyword))
return GlobalPlugins;
- }
+
+
+ var plugin = NonGlobalPlugins[query.ActionKeyword];
+ return new List
+ {
+ plugin
+ };
}
public static async Task> QueryForPluginAsync(PluginPair pair, Query query, CancellationToken token)
{
var results = new List();
+ var metadata = pair.Metadata;
+
try
{
- var metadata = pair.Metadata;
-
- long milliseconds = -1L;
-
- milliseconds = await Stopwatch.DebugAsync($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}",
+ var milliseconds = await Stopwatch.DebugAsync($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}",
async () => results = await pair.Plugin.QueryAsync(query, token).ConfigureAwait(false));
token.ThrowIfCancellationRequested();
@@ -206,7 +205,10 @@ namespace Flow.Launcher.Core.Plugin
// null will be fine since the results will only be added into queue if the token hasn't been cancelled
return null;
}
-
+ catch (Exception e)
+ {
+ throw new FlowPluginException(metadata, e);
+ }
return results;
}
@@ -327,4 +329,4 @@ namespace Flow.Launcher.Core.Plugin
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index b3d56221a..e6329aba1 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -1,31 +1,38 @@
-using System;
+using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
-using Droplex;
-using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Core.ExternalPlugins.Environments;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-using Flow.Launcher.Plugin.SharedCommands;
-using System.Diagnostics;
using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
namespace Flow.Launcher.Core.Plugin
{
public static class PluginsLoader
{
- public const string PythonExecutable = "pythonw.exe";
-
public static List Plugins(List metadatas, PluginsSettings settings)
{
var dotnetPlugins = DotNetPlugins(metadatas);
- var pythonPlugins = PythonPlugins(metadatas, settings);
+
+ var pythonEnv = new PythonEnvironment(metadatas, settings);
+ var tsEnv = new TypeScriptEnvironment(metadatas, settings);
+ var jsEnv = new JavaScriptEnvironment(metadatas, settings);
+ var pythonPlugins = pythonEnv.Setup();
+ var tsPlugins = tsEnv.Setup();
+ var jsPlugins = jsEnv.Setup();
+
var executablePlugins = ExecutablePlugins(metadatas);
- var plugins = dotnetPlugins.Concat(pythonPlugins).Concat(executablePlugins).ToList();
+
+ var plugins = dotnetPlugins
+ .Concat(pythonPlugins)
+ .Concat(tsPlugins)
+ .Concat(jsPlugins)
+ .Concat(executablePlugins)
+ .ToList();
return plugins;
}
@@ -41,14 +48,6 @@ namespace Flow.Launcher.Core.Plugin
var milliseconds = Stopwatch.Debug(
$"|PluginsLoader.DotNetPlugins|Constructor init cost for {metadata.Name}", () =>
{
-#if DEBUG
- var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
- var assembly = assemblyLoader.LoadAssemblyAndDependencies();
- var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly,
- typeof(IAsyncPlugin));
-
- var plugin = Activator.CreateInstance(type) as IAsyncPlugin;
-#else
Assembly assembly = null;
IAsyncPlugin plugin = null;
@@ -62,6 +61,12 @@ namespace Flow.Launcher.Core.Plugin
plugin = Activator.CreateInstance(type) as IAsyncPlugin;
}
+#if DEBUG
+ catch (Exception e)
+ {
+ throw;
+ }
+#else
catch (Exception e) when (assembly == null)
{
Log.Exception($"|PluginsLoader.DotNetPlugins|Couldn't load assembly for the plugin: {metadata.Name}", e);
@@ -79,6 +84,7 @@ namespace Flow.Launcher.Core.Plugin
Log.Exception($"|PluginsLoader.DotNetPlugins|The following plugin has errored and can not be loaded: <{metadata.Name}>", e);
}
#endif
+
if (plugin == null)
{
erroredPlugins.Add(metadata.Name);
@@ -98,7 +104,7 @@ namespace Flow.Launcher.Core.Plugin
+ (erroredPlugins.Count > 1 ? "plugins have " : "plugin has ")
+ "errored and cannot be loaded:";
- Task.Run(() =>
+ _ = Task.Run(() =>
{
MessageBox.Show($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
$"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
@@ -110,97 +116,10 @@ namespace Flow.Launcher.Core.Plugin
return plugins;
}
- public static IEnumerable PythonPlugins(List source, PluginsSettings settings)
- {
- if (!source.Any(o => o.Language.ToUpper() == AllowedLanguage.Python))
- return new List();
-
- if (!string.IsNullOrEmpty(settings.PythonDirectory) && FilesFolders.LocationExists(settings.PythonDirectory))
- return SetPythonPathForPluginPairs(source, Path.Combine(settings.PythonDirectory, PythonExecutable));
-
- var pythonPath = string.Empty;
-
- if (MessageBox.Show("Flow detected you have installed Python plugins, which " +
- "will need Python to run. Would you like to download Python? " +
- Environment.NewLine + Environment.NewLine +
- "Click no if it's already installed, " +
- "and you will be prompted to select the folder that contains the Python executable",
- string.Empty, MessageBoxButtons.YesNo) == DialogResult.No
- && string.IsNullOrEmpty(settings.PythonDirectory))
- {
- var dlg = new FolderBrowserDialog
- {
- SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
- };
-
- var result = dlg.ShowDialog();
- if (result == DialogResult.OK)
- {
- string pythonDirectory = dlg.SelectedPath;
- if (!string.IsNullOrEmpty(pythonDirectory))
- {
- pythonPath = Path.Combine(pythonDirectory, PythonExecutable);
- if (File.Exists(pythonPath))
- {
- settings.PythonDirectory = pythonDirectory;
- Constant.PythonPath = pythonPath;
- }
- else
- {
- MessageBox.Show("Can't find python in given directory");
- }
- }
- }
- }
- else
- {
- var installedPythonDirectory = Path.Combine(DataLocation.DataDirectory(), "PythonEmbeddable");
-
- // Python 3.8.9 is used for Windows 7 compatibility
- DroplexPackage.Drop(App.python_3_8_9_embeddable, installedPythonDirectory).Wait();
-
- pythonPath = Path.Combine(installedPythonDirectory, PythonExecutable);
- if (FilesFolders.FileExists(pythonPath))
- {
- settings.PythonDirectory = installedPythonDirectory;
- Constant.PythonPath = pythonPath;
- }
- else
- {
- Log.Error("PluginsLoader",
- $"Failed to set Python path after Droplex install, {pythonPath} does not exist",
- "PythonPlugins");
- }
- }
-
- if (string.IsNullOrEmpty(settings.PythonDirectory) || string.IsNullOrEmpty(pythonPath))
- {
- MessageBox.Show(
- "Unable to set Python executable path, please try from Flow's settings (scroll down to the bottom).");
- Log.Error("PluginsLoader",
- $"Not able to successfully set Python path, the PythonDirectory variable is still an empty string.",
- "PythonPlugins");
-
- return new List();
- }
-
- return SetPythonPathForPluginPairs(source, pythonPath);
- }
-
- private static IEnumerable SetPythonPathForPluginPairs(List source, string pythonPath)
- => source
- .Where(o => o.Language.ToUpper() == AllowedLanguage.Python)
- .Select(metadata => new PluginPair
- {
- Plugin = new PythonPlugin(pythonPath),
- Metadata = metadata
- })
- .ToList();
-
public static IEnumerable ExecutablePlugins(IEnumerable source)
{
return source
- .Where(o => o.Language.ToUpper() == AllowedLanguage.Executable)
+ .Where(o => o.Language.Equals(AllowedLanguage.Executable, StringComparison.OrdinalIgnoreCase))
.Select(metadata => new PluginPair
{
Plugin = new ExecutablePlugin(metadata.ExecuteFilePath), Metadata = metadata
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 8f7e5760a..2bbf6d110 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
@@ -11,7 +11,6 @@ namespace Flow.Launcher.Core.Plugin
internal class PythonPlugin : JsonRPCPlugin
{
private readonly ProcessStartInfo _startInfo;
- public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
public PythonPlugin(string filename)
{
@@ -46,6 +45,7 @@ namespace Flow.Launcher.Core.Plugin
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
+ // since this is not static, request strings will build up in ArgumentList if index is not specified
_startInfo.ArgumentList[2] = rpcRequest.ToString();
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action
diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
index ef387b693..a819f94b7 100644
--- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs
+++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
@@ -16,7 +16,7 @@ namespace Flow.Launcher.Core.Plugin
return null;
}
- var rawQuery = string.Join(Query.TermSeparator, terms);
+ var rawQuery = text;
string actionKeyword, search;
string possibleActionKeyword = terms[0];
string[] searchTerms;
@@ -24,13 +24,13 @@ namespace Flow.Launcher.Core.Plugin
if (nonGlobalPlugins.TryGetValue(possibleActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled)
{ // use non global plugin for query
actionKeyword = possibleActionKeyword;
- search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..] : string.Empty;
+ search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
searchTerms = terms[1..];
}
else
{ // non action keyword
actionKeyword = string.Empty;
- search = rawQuery;
+ search = rawQuery.TrimStart();
searchTerms = terms;
}
diff --git a/Flow.Launcher.Core/Properties/AssemblyInfo.cs b/Flow.Launcher.Core/Properties/AssemblyInfo.cs
index 40017c46c..ad60e2c9f 100644
--- a/Flow.Launcher.Core/Properties/AssemblyInfo.cs
+++ b/Flow.Launcher.Core/Properties/AssemblyInfo.cs
@@ -1,3 +1,3 @@
using System.Runtime.CompilerServices;
-[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
index 0ad7ede1e..f541d3f35 100644
--- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs
+++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
@@ -19,6 +19,8 @@ namespace Flow.Launcher.Core.Resource
public static Language Serbian = new Language("sr", "Srpski");
public static Language Portuguese_Portugal = new Language("pt-pt", "Português");
public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)");
+ public static Language Spanish = new Language("es", "Spanish");
+ public static Language Spanish_LatinAmerica = new Language("es-419", "Spanish (Latin America)");
public static Language Italian = new Language("it", "Italiano");
public static Language Norwegian_Bokmal = new Language("nb-NO", "Norsk Bokmål");
public static Language Slovak = new Language("sk", "Slovenský");
@@ -43,6 +45,8 @@ namespace Flow.Launcher.Core.Resource
Serbian,
Portuguese_Portugal,
Portuguese_Brazil,
+ Spanish,
+ Spanish_LatinAmerica,
Italian,
Norwegian_Bokmal,
Slovak,
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 374f7c71f..acc693ed5 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -96,10 +96,17 @@ namespace Flow.Launcher.Core.Resource
{
LoadLanguage(language);
}
- Settings.Language = language.LanguageCode;
- CultureInfo.CurrentCulture = new CultureInfo(language.LanguageCode);
+ // Culture of this thread
+ // Use CreateSpecificCulture to preserve possible user-override settings in Windows
+ CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode);
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
- Task.Run(() =>
+ // App domain
+ CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode);
+ CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.DefaultThreadCurrentCulture;
+
+ // Raise event after culture is set
+ Settings.Language = language.LanguageCode;
+ _ = Task.Run(() =>
{
UpdatePluginMetadataTranslations();
});
@@ -115,7 +122,11 @@ namespace Flow.Launcher.Core.Resource
if (languageToSet != AvailableLanguages.Chinese && languageToSet != AvailableLanguages.Chinese_TW)
return false;
- if (MessageBox.Show("Do you want to turn on search with Pinyin?", string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
+ // No other languages should show the following text so just make it hard-coded
+ // "Do you want to search with pinyin?"
+ string text = languageToSet == AvailableLanguages.Chinese ? "是否启用拼音搜索?" : "是否啓用拼音搜索?" ;
+
+ if (MessageBox.Show(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
return false;
return true;
@@ -182,6 +193,7 @@ namespace Flow.Launcher.Core.Resource
{
p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle();
p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription();
+ pluginI18N.OnCultureInfoChanged(CultureInfo.DefaultThreadCurrentCulture);
}
catch (Exception e)
{
@@ -220,4 +232,4 @@ namespace Flow.Launcher.Core.Resource
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/Resource/LocalizationConverter.cs b/Flow.Launcher.Core/Resource/LocalizationConverter.cs
index 1d835a831..81600e023 100644
--- a/Flow.Launcher.Core/Resource/LocalizationConverter.cs
+++ b/Flow.Launcher.Core/Resource/LocalizationConverter.cs
@@ -4,7 +4,7 @@ using System.Globalization;
using System.Reflection;
using System.Windows.Data;
-namespace Flow.Launcher.Core
+namespace Flow.Launcher.Core.Resource
{
public class LocalizationConverter : IValueConverter
{
diff --git a/Flow.Launcher.Core/Resource/LocalizedDescriptionAttribute.cs b/Flow.Launcher.Core/Resource/LocalizedDescriptionAttribute.cs
index af8b23136..52a232334 100644
--- a/Flow.Launcher.Core/Resource/LocalizedDescriptionAttribute.cs
+++ b/Flow.Launcher.Core/Resource/LocalizedDescriptionAttribute.cs
@@ -1,7 +1,6 @@
using System.ComponentModel;
-using Flow.Launcher.Core.Resource;
-namespace Flow.Launcher.Core
+namespace Flow.Launcher.Core.Resource
{
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs
index 6561419a1..96338cf6a 100644
--- a/Flow.Launcher.Core/Resource/Theme.cs
+++ b/Flow.Launcher.Core/Resource/Theme.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Core.Resource
{
public class Theme
{
- private const int ShadowExtraMargin = 12;
+ private const int ShadowExtraMargin = 32;
private readonly List _themeDirectories = new List();
private ResourceDictionary _oldResource;
@@ -36,7 +36,7 @@ namespace Flow.Launcher.Core.Resource
{
_themeDirectories.Add(DirectoryPath);
_themeDirectories.Add(UserDirectoryPath);
- MakesureThemeDirectoriesExist();
+ MakeSureThemeDirectoriesExist();
var dicts = Application.Current.Resources.MergedDictionaries;
_oldResource = dicts.First(d =>
@@ -55,20 +55,17 @@ namespace Flow.Launcher.Core.Resource
_oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath);
}
- private void MakesureThemeDirectoriesExist()
+ private void MakeSureThemeDirectoriesExist()
{
- foreach (string dir in _themeDirectories)
+ foreach (var dir in _themeDirectories.Where(dir => !Directory.Exists(dir)))
{
- if (!Directory.Exists(dir))
+ try
{
- try
- {
- Directory.CreateDirectory(dir);
- }
- catch (Exception e)
- {
- Log.Exception($"|Theme.MakesureThemeDirectoriesExist|Exception when create directory <{dir}>", e);
- }
+ Directory.CreateDirectory(dir);
+ }
+ catch (Exception e)
+ {
+ Log.Exception($"|Theme.MakesureThemeDirectoriesExist|Exception when create directory <{dir}>", e);
}
}
}
@@ -82,13 +79,17 @@ namespace Flow.Launcher.Core.Resource
{
if (string.IsNullOrEmpty(path))
throw new DirectoryNotFoundException("Theme path can't be found <{path}>");
-
+
+ // reload all resources even if the theme itself hasn't changed in order to pickup changes
+ // to things like fonts
+ UpdateResourceDictionary(GetResourceDictionary(theme));
+
Settings.Theme = theme;
+
//always allow re-loading default theme, in case of failure of switching to a new theme from default theme
if (_oldTheme != theme || theme == defaultTheme)
{
- UpdateResourceDictionary(GetResourceDictionary());
_oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath);
}
@@ -99,7 +100,7 @@ namespace Flow.Launcher.Core.Resource
SetBlurForWindow();
}
- catch (DirectoryNotFoundException e)
+ catch (DirectoryNotFoundException)
{
Log.Error($"|Theme.ChangeTheme|Theme <{theme}> path can't be found");
if (theme != defaultTheme)
@@ -109,7 +110,7 @@ namespace Flow.Launcher.Core.Resource
}
return false;
}
- catch (XamlParseException e)
+ catch (XamlParseException)
{
Log.Error($"|Theme.ChangeTheme|Theme <{theme}> fail to parse");
if (theme != defaultTheme)
@@ -131,9 +132,9 @@ namespace Flow.Launcher.Core.Resource
_oldResource = dictionaryToUpdate;
}
- private ResourceDictionary CurrentThemeResourceDictionary()
+ private ResourceDictionary GetThemeResourceDictionary(string theme)
{
- var uri = GetThemePath(Settings.Theme);
+ var uri = GetThemePath(theme);
var dict = new ResourceDictionary
{
Source = new Uri(uri, UriKind.Absolute)
@@ -142,10 +143,12 @@ namespace Flow.Launcher.Core.Resource
return dict;
}
- public ResourceDictionary GetResourceDictionary()
+ private ResourceDictionary CurrentThemeResourceDictionary() => GetThemeResourceDictionary(Settings.Theme);
+
+ public ResourceDictionary GetResourceDictionary(string theme)
{
- var dict = CurrentThemeResourceDictionary();
-
+ var dict = GetThemeResourceDictionary(theme);
+
if (dict["QueryBoxStyle"] is Style queryBoxStyle &&
dict["QuerySuggestionBoxStyle"] is Style querySuggestionBoxStyle)
{
@@ -197,6 +200,11 @@ namespace Flow.Launcher.Core.Resource
return dict;
}
+ private ResourceDictionary GetCurrentResourceDictionary( )
+ {
+ return GetResourceDictionary(Settings.Theme);
+ }
+
public List LoadAvailableThemes()
{
List themes = new List();
@@ -226,7 +234,7 @@ namespace Flow.Launcher.Core.Resource
public void AddDropShadowEffectToCurrentTheme()
{
- var dict = GetResourceDictionary();
+ var dict = GetCurrentResourceDictionary();
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
@@ -235,9 +243,10 @@ namespace Flow.Launcher.Core.Resource
Property = Border.EffectProperty,
Value = new DropShadowEffect
{
- Opacity = 0.4,
- ShadowDepth = 2,
- BlurRadius = 15
+ Opacity = 0.3,
+ ShadowDepth = 12,
+ Direction = 270,
+ BlurRadius = 30
}
};
@@ -247,7 +256,7 @@ namespace Flow.Launcher.Core.Resource
marginSetter = new Setter()
{
Property = Border.MarginProperty,
- Value = new Thickness(ShadowExtraMargin),
+ Value = new Thickness(ShadowExtraMargin, 12, ShadowExtraMargin, ShadowExtraMargin),
};
windowBorderStyle.Setters.Add(marginSetter);
}
@@ -269,7 +278,7 @@ namespace Flow.Launcher.Core.Resource
public void RemoveDropShadowEffectFromCurrentTheme()
{
- var dict = CurrentThemeResourceDictionary();
+ var dict = GetCurrentResourceDictionary();
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
var effectSetter = windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.EffectProperty) as Setter;
diff --git a/Flow.Launcher.Core/Resource/TranslationConverter.cs b/Flow.Launcher.Core/Resource/TranslationConverter.cs
new file mode 100644
index 000000000..ebab99e5b
--- /dev/null
+++ b/Flow.Launcher.Core/Resource/TranslationConverter.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Core.Resource
+{
+ public class TranslationConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var key = value.ToString();
+ if (String.IsNullOrEmpty(key))
+ return key;
+ return InternationalizationManager.Instance.GetTranslation(key);
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher.Core/Updater.cs b/Flow.Launcher.Core/Updater.cs
index 69b537b39..3f64b273e 100644
--- a/Flow.Launcher.Core/Updater.cs
+++ b/Flow.Launcher.Core/Updater.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
@@ -33,14 +33,14 @@ namespace Flow.Launcher.Core
public async Task UpdateAppAsync(IPublicAPI api, bool silentUpdate = true)
{
- await UpdateLock.WaitAsync();
+ await UpdateLock.WaitAsync().ConfigureAwait(false);
try
{
if (!silentUpdate)
api.ShowMsg(api.GetTranslation("pleaseWait"),
api.GetTranslation("update_flowlauncher_update_check"));
- using var updateManager = await GitHubUpdateManager(GitHubRepository).ConfigureAwait(false);
+ using var updateManager = await GitHubUpdateManagerAsync(GitHubRepository).ConfigureAwait(false);
// UpdateApp CheckForUpdate will return value only if the app is squirrel installed
var newUpdateInfo = await updateManager.CheckForUpdate().NonNull().ConfigureAwait(false);
@@ -79,7 +79,7 @@ namespace Flow.Launcher.Core
await updateManager.CreateUninstallerRegistryEntry().ConfigureAwait(false);
}
- var newVersionTips = NewVersinoTips(newReleaseVersion.ToString());
+ var newVersionTips = NewVersionTips(newReleaseVersion.ToString());
Log.Info($"|Updater.UpdateApp|Update success:{newVersionTips}");
@@ -88,9 +88,13 @@ namespace Flow.Launcher.Core
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
}
- catch (Exception e) when (e is HttpRequestException or WebException or SocketException || e.InnerException is TimeoutException)
+ catch (Exception e)
{
- Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e);
+ if ((e is HttpRequestException or WebException or SocketException || e.InnerException is TimeoutException))
+ Log.Exception($"|Updater.UpdateApp|Check your connection and proxy settings to github-cloud.s3.amazonaws.com.", e);
+ else
+ Log.Exception($"|Updater.UpdateApp|Error Occurred", e);
+
if (!silentUpdate)
api.ShowMsg(api.GetTranslation("update_flowlauncher_fail"),
api.GetTranslation("update_flowlauncher_check_connection"));
@@ -114,8 +118,8 @@ namespace Flow.Launcher.Core
public string HtmlUrl { get; [UsedImplicitly] set; }
}
- /// https://github.com/Squirrel/Squirrel.Windows/blob/master/src/Squirrel/UpdateManager.Factory.cs
- private async Task GitHubUpdateManager(string repository)
+ // https://github.com/Squirrel/Squirrel.Windows/blob/master/src/Squirrel/UpdateManager.Factory.cs
+ private async Task GitHubUpdateManagerAsync(string repository)
{
var uri = new Uri(repository);
var api = $"https://api.github.com/repos{uri.AbsolutePath}/releases";
@@ -137,12 +141,12 @@ namespace Flow.Launcher.Core
return manager;
}
- public string NewVersinoTips(string version)
+ public string NewVersionTips(string version)
{
- var translater = InternationalizationManager.Instance;
- var tips = string.Format(translater.GetTranslation("newVersionTips"), version);
+ var translator = InternationalizationManager.Instance;
+ var tips = string.Format(translator.GetTranslation("newVersionTips"), version);
+
return tips;
}
-
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Infrastructure/Constant.cs b/Flow.Launcher.Infrastructure/Constant.cs
index 57b39e46e..e23d2137e 100644
--- a/Flow.Launcher.Infrastructure/Constant.cs
+++ b/Flow.Launcher.Infrastructure/Constant.cs
@@ -1,4 +1,4 @@
-using System.Diagnostics;
+using System.Diagnostics;
using System.IO;
using System.Reflection;
@@ -19,8 +19,9 @@ namespace Flow.Launcher.Infrastructure
public static readonly string RootDirectory = Directory.GetParent(ApplicationDirectory).ToString();
public static readonly string PreinstalledDirectory = Path.Combine(ProgramDirectory, Plugins);
- public const string Issue = "https://github.com/Flow-Launcher/Flow.Launcher/issues/new";
+ public const string Issue = "https://github.com/Flow-Launcher/Flow.Launcher/issues/new/choose";
public static readonly string Version = FileVersionInfo.GetVersionInfo(Assembly.Location.NonNull()).ProductVersion;
+ public static readonly string Dev = "Dev";
public const string Documentation = "https://flowlauncher.com/docs/#/usage-tips";
public static readonly int ThumbnailSize = 64;
@@ -28,8 +29,10 @@ namespace Flow.Launcher.Infrastructure
public static readonly string DefaultIcon = Path.Combine(ImagesDirectory, "app.png");
public static readonly string ErrorIcon = Path.Combine(ImagesDirectory, "app_error.png");
public static readonly string MissingImgIcon = Path.Combine(ImagesDirectory, "app_missing_img.png");
+ public static readonly string LoadingImgIcon = Path.Combine(ImagesDirectory, "loading.png");
public static string PythonPath;
+ public static string NodePath;
public static readonly string QueryTextBoxIconImagePath = $"{ProgramDirectory}\\Images\\mainsearch.svg";
@@ -44,6 +47,7 @@ namespace Flow.Launcher.Infrastructure
public const string Logs = "Logs";
public const string Website = "https://flowlauncher.com";
+ public const string SponsorPage = "https://github.com/sponsors/Flow-Launcher";
public const string GitHub = "https://github.com/Flow-Launcher/Flow.Launcher";
public const string Docs = "https://flowlauncher.com/docs";
}
diff --git a/Flow.Launcher.Infrastructure/Exception/ExceptionFormatter.cs b/Flow.Launcher.Infrastructure/Exception/ExceptionFormatter.cs
index 3849f6e30..54c19c048 100644
--- a/Flow.Launcher.Infrastructure/Exception/ExceptionFormatter.cs
+++ b/Flow.Launcher.Infrastructure/Exception/ExceptionFormatter.cs
@@ -67,6 +67,7 @@ namespace Flow.Launcher.Infrastructure.Exception
sb.AppendLine($"* IntPtr Length: {IntPtr.Size}");
sb.AppendLine($"* x64: {Environment.Is64BitOperatingSystem}");
sb.AppendLine($"* Python Path: {Constant.PythonPath}");
+ sb.AppendLine($"* Node Path: {Constant.NodePath}");
sb.AppendLine($"* CLR Version: {Environment.Version}");
sb.AppendLine($"* Installed .NET Framework: ");
foreach (var result in GetFrameworkVersionFromRegistry())
@@ -78,7 +79,7 @@ namespace Flow.Launcher.Infrastructure.Exception
sb.AppendLine();
sb.AppendLine("## Assemblies - " + AppDomain.CurrentDomain.FriendlyName);
sb.AppendLine();
- foreach (var ass in AppDomain.CurrentDomain.GetAssemblies().OrderBy(o => o.GlobalAssemblyCache ? 50 : 0))
+ foreach (var ass in AppDomain.CurrentDomain.GetAssemblies())
{
sb.Append("* ");
sb.Append(ass.FullName);
@@ -166,7 +167,7 @@ namespace Flow.Launcher.Infrastructure.Exception
}
return result;
}
- catch (System.Exception e)
+ catch
{
return new List();
}
diff --git a/Flow.Launcher.Infrastructure/FileExplorerHelper.cs b/Flow.Launcher.Infrastructure/FileExplorerHelper.cs
new file mode 100644
index 000000000..76695a4e3
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/FileExplorerHelper.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+
+namespace Flow.Launcher.Infrastructure
+{
+ public static class FileExplorerHelper
+ {
+ ///
+ /// Gets the path of the file explorer that is currently in the foreground
+ ///
+ public static string GetActiveExplorerPath()
+ {
+ var explorerWindow = GetActiveExplorer();
+ string locationUrl = explorerWindow?.LocationURL;
+ return !string.IsNullOrEmpty(locationUrl) ? new Uri(locationUrl).LocalPath + "\\" : null;
+ }
+
+ ///
+ /// Gets the file explorer that is currently in the foreground
+ ///
+ private static dynamic GetActiveExplorer()
+ {
+ Type type = Type.GetTypeFromProgID("Shell.Application");
+ if (type == null) return null;
+ dynamic shell = Activator.CreateInstance(type);
+ if (shell == null)
+ {
+ return null;
+ }
+
+ var explorerWindows = new List();
+ var openWindows = shell.Windows();
+ for (int i = 0; i < openWindows.Count; i++)
+ {
+ var window = openWindows.Item(i);
+ if (window == null) continue;
+
+ // find the desired window and make sure that it is indeed a file explorer
+ // we don't want the Internet Explorer or the classic control panel
+ // ToLower() is needed, because Windows can report the path as "C:\\Windows\\Explorer.EXE"
+ if (Path.GetFileName((string)window.FullName)?.ToLower() == "explorer.exe")
+ {
+ explorerWindows.Add(window);
+ }
+ }
+
+ if (explorerWindows.Count == 0) return null;
+
+ var zOrders = GetZOrder(explorerWindows);
+
+ return explorerWindows.Zip(zOrders).MinBy(x => x.Second).First;
+ }
+
+ [DllImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
+
+ private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
+
+ ///
+ /// Gets the z-order for one or more windows atomically with respect to each other. In Windows, smaller z-order is higher. If the window is not top level, the z order is returned as -1.
+ ///
+ private static IEnumerable GetZOrder(List hWnds)
+ {
+ var z = new int[hWnds.Count];
+ for (var i = 0; i < hWnds.Count; i++) z[i] = -1;
+
+ var index = 0;
+ var numRemaining = hWnds.Count;
+ EnumWindows((wnd, _) =>
+ {
+ var searchIndex = hWnds.FindIndex(x => x.HWND == wnd.ToInt32());
+ if (searchIndex != -1)
+ {
+ z[searchIndex] = index;
+ numRemaining--;
+ if (numRemaining == 0) return false;
+ }
+ index++;
+ return true;
+ }, IntPtr.Zero);
+
+ return z;
+ }
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 40c2cb956..f4d7511c6 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -1,7 +1,7 @@
- net5.0-windows
+ net7.0-windows
{4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}
Library
true
@@ -53,27 +53,16 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
-
+
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/Helper.cs b/Flow.Launcher.Infrastructure/Helper.cs
index faa4c93b5..db575de90 100644
--- a/Flow.Launcher.Infrastructure/Helper.cs
+++ b/Flow.Launcher.Infrastructure/Helper.cs
@@ -1,4 +1,6 @@
-using System;
+#nullable enable
+
+using System;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text.Json;
@@ -16,7 +18,7 @@ namespace Flow.Launcher.Infrastructure
///
/// http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy
///
- public static T NonNull(this T obj)
+ public static T NonNull(this T? obj)
{
if (obj == null)
{
diff --git a/Flow.Launcher.Infrastructure/Hotkey/HotkeyModel.cs b/Flow.Launcher.Infrastructure/Hotkey/HotkeyModel.cs
index 5bd97714c..937059436 100644
--- a/Flow.Launcher.Infrastructure/Hotkey/HotkeyModel.cs
+++ b/Flow.Launcher.Infrastructure/Hotkey/HotkeyModel.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq;
using System.Windows.Input;
@@ -11,10 +12,10 @@ namespace Flow.Launcher.Infrastructure.Hotkey
public bool Shift { get; set; }
public bool Win { get; set; }
public bool Ctrl { get; set; }
- public Key CharKey { get; set; }
+ public Key CharKey { get; set; } = Key.None;
- Dictionary specialSymbolDictionary = new Dictionary
+ private static readonly Dictionary specialSymbolDictionary = new Dictionary
{
{Key.Space, "Space"},
{Key.Oem3, "~"}
@@ -27,19 +28,19 @@ namespace Flow.Launcher.Infrastructure.Hotkey
ModifierKeys modifierKeys = ModifierKeys.None;
if (Alt)
{
- modifierKeys = ModifierKeys.Alt;
+ modifierKeys |= ModifierKeys.Alt;
}
if (Shift)
{
- modifierKeys = modifierKeys | ModifierKeys.Shift;
+ modifierKeys |= ModifierKeys.Shift;
}
if (Win)
{
- modifierKeys = modifierKeys | ModifierKeys.Windows;
+ modifierKeys |= ModifierKeys.Windows;
}
if (Ctrl)
{
- modifierKeys = modifierKeys | ModifierKeys.Control;
+ modifierKeys |= ModifierKeys.Control;
}
return modifierKeys;
}
@@ -86,7 +87,7 @@ namespace Flow.Launcher.Infrastructure.Hotkey
Ctrl = true;
keys.Remove("Ctrl");
}
- if (keys.Count > 0)
+ if (keys.Count == 1)
{
string charKey = keys[0];
KeyValuePair? specialSymbolPair = specialSymbolDictionary.FirstOrDefault(pair => pair.Value == charKey);
@@ -98,7 +99,7 @@ namespace Flow.Launcher.Infrastructure.Hotkey
{
try
{
- CharKey = (Key) Enum.Parse(typeof (Key), charKey);
+ CharKey = (Key)Enum.Parse(typeof(Key), charKey);
}
catch (ArgumentException)
{
@@ -110,36 +111,116 @@ namespace Flow.Launcher.Infrastructure.Hotkey
public override string ToString()
{
- string text = string.Empty;
+ List keys = new List();
if (Ctrl)
{
- text += "Ctrl + ";
+ keys.Add("Ctrl");
}
if (Alt)
{
- text += "Alt + ";
+ keys.Add("Alt");
}
if (Shift)
{
- text += "Shift + ";
+ keys.Add("Shift");
}
if (Win)
{
- text += "Win + ";
+ keys.Add("Win");
}
if (CharKey != Key.None)
{
- text += specialSymbolDictionary.ContainsKey(CharKey)
+ keys.Add(specialSymbolDictionary.ContainsKey(CharKey)
? specialSymbolDictionary[CharKey]
- : CharKey.ToString();
+ : CharKey.ToString());
}
- else if (!string.IsNullOrEmpty(text))
+ return string.Join(" + ", keys);
+ }
+
+ ///
+ /// Validate hotkey
+ ///
+ /// Try to validate hotkey as a KeyGesture.
+ ///
+ public bool Validate(bool validateKeyGestrue = false)
+ {
+ switch (CharKey)
{
- text = text.Remove(text.Length - 3);
+ case Key.LeftAlt:
+ case Key.RightAlt:
+ case Key.LeftCtrl:
+ case Key.RightCtrl:
+ case Key.LeftShift:
+ case Key.RightShift:
+ case Key.LWin:
+ case Key.RWin:
+ case Key.None:
+ return false;
+ default:
+ if (validateKeyGestrue)
+ {
+ try
+ {
+ KeyGesture keyGesture = new KeyGesture(CharKey, ModifierKeys);
+ }
+ catch (System.Exception e) when (e is NotSupportedException || e is InvalidEnumArgumentException)
+ {
+ return false;
+ }
+ }
+ if (ModifierKeys == ModifierKeys.None)
+ {
+ return !IsPrintableCharacter(CharKey);
+ }
+ else
+ {
+ return true;
+ }
}
+ }
- return text;
+ private static bool IsPrintableCharacter(Key key)
+ {
+ // https://stackoverflow.com/questions/11881199/identify-if-a-event-key-is-text-not-only-alphanumeric
+ return (key >= Key.A && key <= Key.Z) ||
+ (key >= Key.D0 && key <= Key.D9) ||
+ (key >= Key.NumPad0 && key <= Key.NumPad9) ||
+ key == Key.OemQuestion ||
+ key == Key.OemQuotes ||
+ key == Key.OemPlus ||
+ key == Key.OemOpenBrackets ||
+ key == Key.OemCloseBrackets ||
+ key == Key.OemMinus ||
+ key == Key.DeadCharProcessed ||
+ key == Key.Oem1 ||
+ key == Key.Oem7 ||
+ key == Key.OemPeriod ||
+ key == Key.OemComma ||
+ key == Key.OemMinus ||
+ key == Key.Add ||
+ key == Key.Divide ||
+ key == Key.Multiply ||
+ key == Key.Subtract ||
+ key == Key.Oem102 ||
+ key == Key.Decimal;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is HotkeyModel other)
+ {
+ return ModifierKeys == other.ModifierKeys && CharKey == other.CharKey;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(ModifierKeys, CharKey);
}
}
}
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index 9f4146b7b..e5be0701f 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -68,7 +68,7 @@ namespace Flow.Launcher.Infrastructure.Http
var userName when string.IsNullOrEmpty(userName) =>
(new Uri($"http://{Proxy.Server}:{Proxy.Port}"), null),
_ => (new Uri($"http://{Proxy.Server}:{Proxy.Port}"),
- new NetworkCredential(Proxy.UserName, Proxy.Password))
+ new NetworkCredential(Proxy.UserName, Proxy.Password))
},
_ => (null, null)
},
@@ -79,7 +79,7 @@ namespace Flow.Launcher.Infrastructure.Http
_ => throw new ArgumentOutOfRangeException()
};
}
- catch(UriFormatException e)
+ catch (UriFormatException e)
{
API.ShowMsg("Please try again", "Unable to parse Http Proxy");
Log.Exception("Flow.Launcher.Infrastructure.Http", "Unable to parse Uri", e);
@@ -94,7 +94,7 @@ namespace Flow.Launcher.Infrastructure.Http
if (response.StatusCode == HttpStatusCode.OK)
{
await using var fileStream = new FileStream(filePath, FileMode.CreateNew);
- await response.Content.CopyToAsync(fileStream);
+ await response.Content.CopyToAsync(fileStream, token);
}
else
{
@@ -117,7 +117,7 @@ namespace Flow.Launcher.Infrastructure.Http
public static Task GetAsync([NotNull] string url, CancellationToken token = default)
{
Log.Debug($"|Http.Get|Url <{url}>");
- return GetAsync(new Uri(url.Replace("#", "%23")), token);
+ return GetAsync(new Uri(url), token);
}
///
@@ -130,36 +130,57 @@ namespace Flow.Launcher.Infrastructure.Http
{
Log.Debug($"|Http.Get|Url <{url}>");
using var response = await client.GetAsync(url, token);
- var content = await response.Content.ReadAsStringAsync();
- if (response.StatusCode == HttpStatusCode.OK)
- {
- return content;
- }
- else
+ var content = await response.Content.ReadAsStringAsync(token);
+ if (response.StatusCode != HttpStatusCode.OK)
{
throw new HttpRequestException(
$"Error code <{response.StatusCode}> with content <{content}> returned from <{url}>");
}
+
+ return content;
}
///
- /// Asynchrously get the result as stream from url.
+ /// Send a GET request to the specified Uri with an HTTP completion option and a cancellation token as an asynchronous operation.
+ ///
+ /// The Uri the request is sent to.
+ /// An HTTP completion option value that indicates when the operation should be considered completed.
+ /// A cancellation token that can be used by other objects or threads to receive notice of cancellation
+ ///
+ public static Task GetStreamAsync([NotNull] string url,
+ CancellationToken token = default) => GetStreamAsync(new Uri(url), token);
+
+
+ ///
+ /// Send a GET request to the specified Uri with an HTTP completion option and a cancellation token as an asynchronous operation.
///
///
+ ///
///
- public static async Task GetStreamAsync([NotNull] string url, CancellationToken token = default)
+ public static async Task GetStreamAsync([NotNull] Uri url,
+ CancellationToken token = default)
{
Log.Debug($"|Http.Get|Url <{url}>");
- var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token);
- return await response.Content.ReadAsStreamAsync();
+ return await client.GetStreamAsync(url, token);
+ }
+
+ public static async Task GetResponseAsync(string url, HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead,
+ CancellationToken token = default)
+ => await GetResponseAsync(new Uri(url), completionOption, token);
+
+ public static async Task GetResponseAsync([NotNull] Uri url, HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead,
+ CancellationToken token = default)
+ {
+ Log.Debug($"|Http.Get|Url <{url}>");
+ return await client.GetAsync(url, completionOption, token);
}
///
/// Asynchrously send an HTTP request.
///
- public static async Task SendAsync(HttpRequestMessage request, CancellationToken token = default)
+ public static async Task SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead, CancellationToken token = default)
{
- return await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token);
+ return await client.SendAsync(request, completionOption, token);
}
}
}
diff --git a/Flow.Launcher.Infrastructure/Image/ImageCache.cs b/Flow.Launcher.Infrastructure/Image/ImageCache.cs
index 13277c7d9..e7b1f46f7 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageCache.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageCache.cs
@@ -1,9 +1,8 @@
-using System;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
-using System.Threading.Tasks;
using System.Windows.Media;
namespace Flow.Launcher.Infrastructure.Image
@@ -25,11 +24,11 @@ namespace Flow.Launcher.Infrastructure.Image
public class ImageCache
{
private const int MaxCached = 50;
- public ConcurrentDictionary Data { get; private set; } = new ConcurrentDictionary();
+ public ConcurrentDictionary<(string, bool), ImageUsage> Data { get; } = new();
private const int permissibleFactor = 2;
private SemaphoreSlim semaphore = new(1, 1);
- public void Initialization(Dictionary usage)
+ public void Initialization(Dictionary<(string, bool), int> usage)
{
foreach (var key in usage.Keys)
{
@@ -37,29 +36,29 @@ namespace Flow.Launcher.Infrastructure.Image
}
}
- public ImageSource this[string path]
+ public ImageSource this[string path, bool isFullImage = false]
{
get
{
- if (Data.TryGetValue(path, out var value))
+ if (!Data.TryGetValue((path, isFullImage), out var value))
{
- value.usage++;
- return value.imageSource;
+ return null;
}
+ value.usage++;
+ return value.imageSource;
- return null;
}
set
{
Data.AddOrUpdate(
- path,
- new ImageUsage(0, value),
- (k, v) =>
- {
- v.imageSource = value;
- v.usage++;
- return v;
- }
+ (path, isFullImage),
+ new ImageUsage(0, value),
+ (k, v) =>
+ {
+ v.imageSource = value;
+ v.usage++;
+ return v;
+ }
);
SliceExtra();
@@ -74,7 +73,7 @@ namespace Flow.Launcher.Infrastructure.Image
// To delete the images from the data dictionary based on the resizing of the Usage Dictionary
// Double Check to avoid concurrent remove
if (Data.Count > permissibleFactor * MaxCached)
- foreach (var key in Data.OrderBy(x => x.Value.usage).Take(Data.Count - MaxCached).Select(x => x.Key).ToArray())
+ foreach (var key in Data.OrderBy(x => x.Value.usage).Take(Data.Count - MaxCached).Select(x => x.Key))
Data.TryRemove(key, out _);
semaphore.Release();
}
@@ -82,9 +81,24 @@ namespace Flow.Launcher.Infrastructure.Image
}
}
- public bool ContainsKey(string key)
+ public bool ContainsKey(string key, bool isFullImage)
{
- return key is not null && Data.ContainsKey(key) && Data[key].imageSource != null;
+ return key is not null && Data.ContainsKey((key, isFullImage)) && Data[(key, isFullImage)].imageSource != null;
+ }
+
+ public bool TryGetValue(string key, bool isFullImage, out ImageSource image)
+ {
+ if (key is not null)
+ {
+ bool hasKey = Data.TryGetValue((key, isFullImage), out var imageUsage);
+ image = hasKey ? imageUsage.imageSource : null;
+ return hasKey;
+ }
+ else
+ {
+ image = null;
+ return false;
+ }
}
public int CacheSize()
@@ -100,4 +114,4 @@ namespace Flow.Launcher.Infrastructure.Image
return Data.Values.Select(x => x.imageSource).Distinct().Count();
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Infrastructure/Image/ImageHashGenerator.cs b/Flow.Launcher.Infrastructure/Image/ImageHashGenerator.cs
index 736133052..2611e99e8 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageHashGenerator.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageHashGenerator.cs
@@ -14,30 +14,23 @@ namespace Flow.Launcher.Infrastructure.Image
{
public string GetHashFromImage(ImageSource imageSource)
{
- if (!(imageSource is BitmapSource image))
+ if (imageSource is not BitmapSource image)
{
return null;
}
try
{
- using (var outStream = new MemoryStream())
- {
- // PngBitmapEncoder enc2 = new PngBitmapEncoder();
- // enc2.Frames.Add(BitmapFrame.Create(tt));
-
- var enc = new JpegBitmapEncoder();
- var bitmapFrame = BitmapFrame.Create(image);
- bitmapFrame.Freeze();
- enc.Frames.Add(bitmapFrame);
- enc.Save(outStream);
- var byteArray = outStream.GetBuffer();
- using (var sha1 = new SHA1CryptoServiceProvider())
- {
- var hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
- return hash;
- }
- }
+ using var outStream = new MemoryStream();
+ var enc = new JpegBitmapEncoder();
+ var bitmapFrame = BitmapFrame.Create(image);
+ bitmapFrame.Freeze();
+ enc.Frames.Add(bitmapFrame);
+ enc.Save(outStream);
+ var byteArray = outStream.GetBuffer();
+ using var sha1 = SHA1.Create();
+ var hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
+ return hash;
}
catch
{
@@ -46,4 +39,4 @@ namespace Flow.Launcher.Infrastructure.Image
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index ac333d567..62524f03a 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -1,59 +1,63 @@
-using System;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Linq;
+using System.Net;
+using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.Storage;
+using static Flow.Launcher.Infrastructure.Http.Http;
namespace Flow.Launcher.Infrastructure.Image
{
public static class ImageLoader
{
- private static readonly ImageCache ImageCache = new ImageCache();
- private static BinaryStorage> _storage;
- private static readonly ConcurrentDictionary GuidToKey = new ConcurrentDictionary();
+ private static readonly ImageCache ImageCache = new();
+ private static BinaryStorage> _storage;
+ private static readonly ConcurrentDictionary GuidToKey = new();
private static IImageHashGenerator _hashGenerator;
- private static bool EnableImageHash = true;
- public static ImageSource DefaultImage { get; } = new BitmapImage(new Uri(Constant.MissingImgIcon));
+ private static readonly bool EnableImageHash = true;
+ public static ImageSource MissingImage { get; } = new BitmapImage(new Uri(Constant.MissingImgIcon));
+ public static ImageSource LoadingImage { get; } = new BitmapImage(new Uri(Constant.LoadingImgIcon));
+ public const int SmallIconSize = 64;
+ public const int FullIconSize = 256;
private static readonly string[] ImageExtensions =
{
- ".png",
- ".jpg",
- ".jpeg",
- ".gif",
- ".bmp",
- ".tiff",
- ".ico"
+ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico"
};
public static void Initialize()
{
- _storage = new BinaryStorage>("Image");
+ _storage = new BinaryStorage>("Image");
_hashGenerator = new ImageHashGenerator();
var usage = LoadStorageToConcurrentDictionary();
- foreach (var icon in new[] { Constant.DefaultIcon, Constant.MissingImgIcon })
+ foreach (var icon in new[]
+ {
+ Constant.DefaultIcon, Constant.MissingImgIcon
+ })
{
ImageSource img = new BitmapImage(new Uri(icon));
img.Freeze();
- ImageCache[icon] = img;
+ ImageCache[icon, false] = img;
}
- Task.Run(() =>
+ _ = Task.Run(async () =>
{
- Stopwatch.Normal("|ImageLoader.Initialize|Preload images cost", () =>
+ await Stopwatch.NormalAsync("|ImageLoader.Initialize|Preload images cost", async () =>
{
- ImageCache.Data.AsParallel().ForAll(x =>
+ foreach (var ((path, isFullImage), _) in ImageCache.Data)
{
- Load(x.Key);
- });
+ await LoadAsync(path, isFullImage);
+ }
});
Log.Info($"|ImageLoader.Initialize|Number of preload images is <{ImageCache.CacheSize()}>, Images Number: {ImageCache.CacheSize()}, Unique Items {ImageCache.UniqueImagesInCache()}");
});
@@ -63,17 +67,20 @@ namespace Flow.Launcher.Infrastructure.Image
{
lock (_storage)
{
- _storage.Save(ImageCache.Data.Select(x => (x.Key, x.Value.usage)).ToDictionary(x => x.Key, x => x.usage));
+ _storage.Save(ImageCache.Data
+ .ToDictionary(
+ x => x.Key,
+ x => x.Value.usage));
}
}
- private static ConcurrentDictionary LoadStorageToConcurrentDictionary()
+ private static ConcurrentDictionary<(string, bool), int> LoadStorageToConcurrentDictionary()
{
lock (_storage)
{
- var loaded = _storage.TryLoad(new Dictionary());
+ var loaded = _storage.TryLoad(new Dictionary<(string, bool), int>());
- return new ConcurrentDictionary(loaded);
+ return new ConcurrentDictionary<(string, bool), int>(loaded);
}
}
@@ -95,11 +102,12 @@ namespace Flow.Launcher.Infrastructure.Image
Folder,
Data,
ImageFile,
+ FullImageFile,
Error,
Cache
}
- private static ImageResult LoadInternal(string path, bool loadFullImage = false)
+ private static async ValueTask LoadInternalAsync(string path, bool loadFullImage = false)
{
ImageResult imageResult;
@@ -107,13 +115,21 @@ namespace Flow.Launcher.Infrastructure.Image
{
if (string.IsNullOrEmpty(path))
{
- return new ImageResult(ImageCache[Constant.MissingImgIcon], ImageType.Error);
- }
- if (ImageCache.ContainsKey(path))
- {
- return new ImageResult(ImageCache[path], ImageType.Cache);
+ return new ImageResult(MissingImage, ImageType.Error);
}
+ if (ImageCache.ContainsKey(path, loadFullImage))
+ {
+ return new ImageResult(ImageCache[path, loadFullImage], ImageType.Cache);
+ }
+
+ if (Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out var uriResult)
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
+ {
+ var image = await LoadRemoteImageAsync(loadFullImage, uriResult);
+ ImageCache[path, loadFullImage] = image;
+ return new ImageResult(image, ImageType.ImageFile);
+ }
if (path.StartsWith("data:", StringComparison.OrdinalIgnoreCase))
{
var imageSource = new BitmapImage(new Uri(path));
@@ -121,12 +137,7 @@ namespace Flow.Launcher.Infrastructure.Image
return new ImageResult(imageSource, ImageType.Data);
}
- if (!Path.IsPathRooted(path))
- {
- path = Path.Combine(Constant.ProgramDirectory, "Images", Path.GetFileName(path));
- }
-
- imageResult = GetThumbnailResult(ref path, loadFullImage);
+ imageResult = await Task.Run(() => GetThumbnailResult(ref path, loadFullImage));
}
catch (System.Exception e)
{
@@ -140,14 +151,35 @@ namespace Flow.Launcher.Infrastructure.Image
Log.Exception($"|ImageLoader.Load|Failed to get thumbnail for {path} on first try", e);
Log.Exception($"|ImageLoader.Load|Failed to get thumbnail for {path} on second try", e2);
- ImageSource image = ImageCache[Constant.MissingImgIcon];
- ImageCache[path] = image;
+ ImageSource image = ImageCache[Constant.MissingImgIcon, false];
+ ImageCache[path, false] = image;
imageResult = new ImageResult(image, ImageType.Error);
}
}
return imageResult;
}
+ private static async Task LoadRemoteImageAsync(bool loadFullImage, Uri uriResult)
+ {
+ // Download image from url
+ await using var resp = await GetStreamAsync(uriResult);
+ await using var buffer = new MemoryStream();
+ await resp.CopyToAsync(buffer);
+ buffer.Seek(0, SeekOrigin.Begin);
+ var image = new BitmapImage();
+ image.BeginInit();
+ image.CacheOption = BitmapCacheOption.OnLoad;
+ if (!loadFullImage)
+ {
+ image.DecodePixelHeight = SmallIconSize;
+ image.DecodePixelWidth = SmallIconSize;
+ }
+ image.StreamSource = buffer;
+ image.EndInit();
+ image.StreamSource = null;
+ image.Freeze();
+ return image;
+ }
private static ImageResult GetThumbnailResult(ref string path, bool loadFullImage = false)
{
@@ -173,6 +205,7 @@ namespace Flow.Launcher.Infrastructure.Image
if (loadFullImage)
{
image = LoadFullImage(path);
+ type = ImageType.FullImageFile;
}
else
{
@@ -187,12 +220,12 @@ namespace Flow.Launcher.Infrastructure.Image
else
{
type = ImageType.File;
- image = GetThumbnail(path, ThumbnailOptions.None);
+ image = GetThumbnail(path, ThumbnailOptions.None, loadFullImage ? FullIconSize : SmallIconSize);
}
}
else
{
- image = ImageCache[Constant.MissingImgIcon];
+ image = ImageCache[Constant.MissingImgIcon, false];
path = Constant.MissingImgIcon;
}
@@ -204,23 +237,28 @@ namespace Flow.Launcher.Infrastructure.Image
return new ImageResult(image, type);
}
- private static BitmapSource GetThumbnail(string path, ThumbnailOptions option = ThumbnailOptions.ThumbnailOnly)
+ private static BitmapSource GetThumbnail(string path, ThumbnailOptions option = ThumbnailOptions.ThumbnailOnly, int size = SmallIconSize)
{
return WindowsThumbnailProvider.GetThumbnail(
path,
- Constant.ThumbnailSize,
- Constant.ThumbnailSize,
+ size,
+ size,
option);
}
- public static bool CacheContainImage(string path)
+ public static bool CacheContainImage(string path, bool loadFullImage = false)
{
- return ImageCache.ContainsKey(path) && ImageCache[path] != null;
+ return ImageCache.ContainsKey(path, loadFullImage);
}
- public static ImageSource Load(string path, bool loadFullImage = false)
+ public static bool TryGetValue(string path, bool loadFullImage, out ImageSource image)
{
- var imageResult = LoadInternal(path, loadFullImage);
+ return ImageCache.TryGetValue(path, loadFullImage, out image);
+ }
+
+ public static async ValueTask LoadAsync(string path, bool loadFullImage = false)
+ {
+ var imageResult = await LoadInternalAsync(path, loadFullImage);
var img = imageResult.ImageSource;
if (imageResult.ImageType != ImageType.Error && imageResult.ImageType != ImageType.Cache)
@@ -231,19 +269,19 @@ namespace Flow.Launcher.Infrastructure.Image
if (GuidToKey.TryGetValue(hash, out string key))
{ // image already exists
- img = ImageCache[key] ?? img;
+ img = ImageCache[key, false] ?? img;
}
else
{ // new guid
+
GuidToKey[hash] = path;
}
}
// update cache
- ImageCache[path] = img;
+ ImageCache[path, loadFullImage] = img;
}
-
return img;
}
@@ -252,8 +290,33 @@ namespace Flow.Launcher.Infrastructure.Image
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
- image.UriSource = new Uri(path);
+ image.UriSource = new Uri(path);
+ image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
image.EndInit();
+
+ if (image.PixelWidth > 320)
+ {
+ BitmapImage resizedWidth = new BitmapImage();
+ resizedWidth.BeginInit();
+ resizedWidth.CacheOption = BitmapCacheOption.OnLoad;
+ resizedWidth.UriSource = new Uri(path);
+ resizedWidth.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
+ resizedWidth.DecodePixelWidth = 320;
+ resizedWidth.EndInit();
+
+ if (resizedWidth.PixelHeight > 320)
+ {
+ BitmapImage resizedHeight = new BitmapImage();
+ resizedHeight.BeginInit();
+ resizedHeight.CacheOption = BitmapCacheOption.OnLoad;
+ resizedHeight.UriSource = new Uri(path);
+ resizedHeight.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
+ resizedHeight.DecodePixelHeight = 320;
+ resizedHeight.EndInit();
+ return resizedHeight;
+ }
+ return resizedWidth;
+ }
return image;
}
}
diff --git a/Flow.Launcher.Infrastructure/Logger/Log.cs b/Flow.Launcher.Infrastructure/Logger/Log.cs
index 75f208c9e..b8f1408e7 100644
--- a/Flow.Launcher.Infrastructure/Logger/Log.cs
+++ b/Flow.Launcher.Infrastructure/Logger/Log.cs
@@ -1,4 +1,4 @@
-using System.Diagnostics;
+using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using NLog;
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 6c2a94e82..7d7235968 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Infrastructure
private List originalIndexs = new List();
private List translatedIndexs = new List();
- private int translaedLength = 0;
+ private int translatedLength = 0;
public string key { get; private set; }
@@ -32,13 +32,13 @@ namespace Flow.Launcher.Infrastructure
originalIndexs.Add(originalIndex);
translatedIndexs.Add(translatedIndex);
translatedIndexs.Add(translatedIndex + length);
- translaedLength += length - 1;
+ translatedLength += length - 1;
}
public int MapToOriginalIndex(int translatedIndex)
{
if (translatedIndex > translatedIndexs.Last())
- return translatedIndex - translaedLength - 1;
+ return translatedIndex - translatedLength - 1;
int lowerBound = 0;
int upperBound = originalIndexs.Count - 1;
@@ -83,7 +83,7 @@ namespace Flow.Launcher.Infrastructure
translatedIndex < translatedIndexs[upperBound * 2])
{
int indexDef = 0;
-
+
for (int j = 0; j < upperBound; j++)
{
indexDef += translatedIndexs[j * 2 + 1] - translatedIndexs[j * 2];
@@ -102,9 +102,24 @@ namespace Flow.Launcher.Infrastructure
}
}
+ ///
+ /// Translate a language to English letters using a given rule.
+ ///
public interface IAlphabet
{
+ ///
+ /// Translate a string to English letters, using a given rule.
+ ///
+ /// String to translate.
+ ///
public (string translation, TranslationMapping map) Translate(string stringToTranslate);
+
+ ///
+ /// Determine if a string can be translated to English letter with this Alphabet.
+ ///
+ /// String to translate.
+ ///
+ public bool CanBeTranslated(string stringToTranslate);
}
public class PinyinAlphabet : IAlphabet
@@ -119,63 +134,70 @@ namespace Flow.Launcher.Infrastructure
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
}
+ public bool CanBeTranslated(string stringToTranslate)
+ {
+ return WordsHelper.HasChinese(stringToTranslate);
+ }
+
public (string translation, TranslationMapping map) Translate(string content)
{
if (_settings.ShouldUsePinyin)
{
if (!_pinyinCache.ContainsKey(content))
{
- if (WordsHelper.HasChinese(content))
- {
- var resultList = WordsHelper.GetPinyinList(content);
-
- StringBuilder resultBuilder = new StringBuilder();
- TranslationMapping map = new TranslationMapping();
-
- bool pre = false;
-
- for (int i = 0; i < resultList.Length; i++)
- {
- if (content[i] >= 0x3400 && content[i] <= 0x9FD5)
- {
- map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1);
- resultBuilder.Append(' ');
- resultBuilder.Append(resultList[i]);
- pre = true;
- }
- else
- {
- if (pre)
- {
- pre = false;
- resultBuilder.Append(' ');
- }
-
- resultBuilder.Append(resultList[i]);
- }
- }
-
- map.endConstruct();
-
- var key = resultBuilder.ToString();
- map.setKey(key);
-
- return _pinyinCache[content] = (key, map);
- }
- else
- {
- return (content, null);
- }
+ return BuildCacheFromContent(content);
}
else
{
return _pinyinCache[content];
}
}
+ return (content, null);
+ }
+
+ private (string translation, TranslationMapping map) BuildCacheFromContent(string content)
+ {
+ if (WordsHelper.HasChinese(content))
+ {
+ var resultList = WordsHelper.GetPinyinList(content);
+
+ StringBuilder resultBuilder = new StringBuilder();
+ TranslationMapping map = new TranslationMapping();
+
+ bool pre = false;
+
+ for (int i = 0; i < resultList.Length; i++)
+ {
+ if (content[i] >= 0x3400 && content[i] <= 0x9FD5)
+ {
+ map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1);
+ resultBuilder.Append(' ');
+ resultBuilder.Append(resultList[i]);
+ pre = true;
+ }
+ else
+ {
+ if (pre)
+ {
+ pre = false;
+ resultBuilder.Append(' ');
+ }
+
+ resultBuilder.Append(resultList[i]);
+ }
+ }
+
+ map.endConstruct();
+
+ var key = resultBuilder.ToString();
+ map.setKey(key);
+
+ return _pinyinCache[content] = (key, map);
+ }
else
{
return (content, null);
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Infrastructure/Properties/AssemblyInfo.cs b/Flow.Launcher.Infrastructure/Properties/AssemblyInfo.cs
index 4cdadffc9..3c29d0dcb 100644
--- a/Flow.Launcher.Infrastructure/Properties/AssemblyInfo.cs
+++ b/Flow.Launcher.Infrastructure/Properties/AssemblyInfo.cs
@@ -2,4 +2,5 @@
[assembly: InternalsVisibleTo("Flow.Launcher")]
[assembly: InternalsVisibleTo("Flow.Launcher.Core")]
-[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
+[assembly: System.Runtime.Versioning.SupportedOSPlatform("Windows10.0.19041.0")]
diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
index 5205543b1..ea2d42773 100644
--- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
@@ -9,6 +9,7 @@ using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher.Infrastructure.Storage
{
+#pragma warning disable SYSLIB0011 // BinaryFormatter is obsolete.
///
/// Stroage object using binary data
/// Normally, it has better performance, but not readable
@@ -113,4 +114,5 @@ namespace Flow.Launcher.Infrastructure.Storage
}
}
}
+#pragma warning restore SYSLIB0011
}
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 0083ccb87..45456ddeb 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -1,4 +1,5 @@
-using System;
+#nullable enable
+using System;
using System.Globalization;
using System.IO;
using System.Text.Json;
@@ -11,62 +12,86 @@ namespace Flow.Launcher.Infrastructure.Storage
///
public class JsonStorage where T : new()
{
- protected T _data;
+ protected T? Data;
+
// need a new directory name
public const string DirectoryName = "Settings";
public const string FileSuffix = ".json";
- public string FilePath { get; set; }
- public string DirectoryPath { get; set; }
+
+ protected string FilePath { get; init; } = null!;
+
+ private string TempFilePath => $"{FilePath}.tmp";
+
+ private string BackupFilePath => $"{FilePath}.bak";
+
+ protected string DirectoryPath { get; init; } = null!;
public T Load()
{
+ string? serialized = null;
+
if (File.Exists(FilePath))
{
- var serialized = File.ReadAllText(FilePath);
- if (!string.IsNullOrWhiteSpace(serialized))
+ serialized = File.ReadAllText(FilePath);
+ }
+
+ if (!string.IsNullOrEmpty(serialized))
+ {
+ try
{
- Deserialize(serialized);
+ Data = JsonSerializer.Deserialize(serialized) ?? TryLoadBackup() ?? LoadDefault();
}
- else
+ catch (JsonException)
{
- LoadDefault();
+ Data = TryLoadBackup() ?? LoadDefault();
}
}
else
{
- LoadDefault();
+ Data = TryLoadBackup() ?? LoadDefault();
}
- return _data.NonNull();
+
+ return Data.NonNull();
}
- private void Deserialize(string serialized)
- {
- try
- {
- _data = JsonSerializer.Deserialize(serialized);
- }
- catch (JsonException e)
- {
- LoadDefault();
- Log.Exception($"|JsonStorage.Deserialize|Deserialize error for json <{FilePath}>", e);
- }
-
- if (_data == null)
- {
- LoadDefault();
- }
- }
-
- private void LoadDefault()
+ private T LoadDefault()
{
if (File.Exists(FilePath))
{
BackupOriginFile();
}
- _data = new T();
- Save();
+ return new T();
+ }
+
+ private T? TryLoadBackup()
+ {
+ if (!File.Exists(BackupFilePath))
+ return default;
+
+ try
+ {
+ var data = JsonSerializer.Deserialize(File.ReadAllText(BackupFilePath));
+
+ if (data != null)
+ {
+ Log.Info($"|JsonStorage.Load|Failed to load settings.json, {BackupFilePath} restored successfully");
+
+ if(File.Exists(FilePath))
+ File.Replace(BackupFilePath, FilePath, null);
+ else
+ File.Move(BackupFilePath, FilePath);
+
+ return data;
+ }
+
+ return default;
+ }
+ catch (JsonException)
+ {
+ return default;
+ }
}
private void BackupOriginFile()
@@ -82,13 +107,22 @@ namespace Flow.Launcher.Infrastructure.Storage
public void Save()
{
- string serialized = JsonSerializer.Serialize(_data, new JsonSerializerOptions() { WriteIndented = true });
+ string serialized = JsonSerializer.Serialize(Data,
+ new JsonSerializerOptions
+ {
+ WriteIndented = true
+ });
- File.WriteAllText(FilePath, serialized);
+ File.WriteAllText(TempFilePath, serialized);
+
+ if (!File.Exists(FilePath))
+ {
+ File.Move(TempFilePath, FilePath);
+ }
+ else
+ {
+ File.Replace(TempFilePath, FilePath, BackupFilePath);
+ }
}
}
-
- [Obsolete("Deprecated as of Flow Launcher v1.8.0, on 2021.06.21. " +
- "This is used only for Everything plugin v1.4.9 or below backwards compatibility")]
- public class JsonStrorage : JsonStorage where T : new() { }
}
diff --git a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
index 923a1a6b5..abe3f55b5 100644
--- a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
@@ -18,7 +18,7 @@ namespace Flow.Launcher.Infrastructure.Storage
public PluginJsonStorage(T data) : this()
{
- _data = data;
+ Data = data;
}
}
}
diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs
index 3ffa9f7b1..bd5dbdda9 100644
--- a/Flow.Launcher.Infrastructure/StringMatcher.cs
+++ b/Flow.Launcher.Infrastructure/StringMatcher.cs
@@ -1,4 +1,4 @@
-using Flow.Launcher.Plugin.SharedModels;
+using Flow.Launcher.Plugin.SharedModels;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -60,8 +60,13 @@ namespace Flow.Launcher.Infrastructure
return new MatchResult(false, UserSettingSearchPrecision);
query = query.Trim();
- TranslationMapping translationMapping;
- (stringToCompare, translationMapping) = _alphabet?.Translate(stringToCompare) ?? (stringToCompare, null);
+ TranslationMapping translationMapping = null;
+ if (_alphabet is not null && !_alphabet.CanBeTranslated(query))
+ {
+ // We assume that if a query can be translated (containing characters of a language, like Chinese)
+ // it actually means user doesn't want it to be translated to English letters.
+ (stringToCompare, translationMapping) = _alphabet.Translate(stringToCompare);
+ }
var currentAcronymQueryIndex = 0;
var acronymMatchData = new List();
@@ -202,7 +207,11 @@ namespace Flow.Launcher.Infrastructure
if (allQuerySubstringsMatched)
{
var nearestSpaceIndex = CalculateClosestSpaceIndex(spaceIndices, firstMatchIndex);
- var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1,
+
+ // firstMatchIndex - nearestSpaceIndex - 1 is to set the firstIndex as the index of the first matched char
+ // preceded by a space e.g. 'world' matching 'hello world' firstIndex would be 0 not 6
+ // giving more weight than 'we or donald' by allowing the distance calculation to treat the starting position at after the space.
+ var score = CalculateSearchScore(query, stringToCompare, firstMatchIndex - nearestSpaceIndex - 1, spaceIndices,
lastMatchIndex - firstMatchIndex, allSubstringsContainedInCompareString);
var resultList = indexList.Select(x => translationMapping?.MapToOriginalIndex(x) ?? x).Distinct().ToList();
@@ -296,7 +305,7 @@ namespace Flow.Launcher.Infrastructure
return currentQuerySubstringIndex >= querySubstringsLength;
}
- private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, int matchLen,
+ private static int CalculateSearchScore(string query, string stringToCompare, int firstIndex, List spaceIndices, int matchLen,
bool allSubstringsContainedInCompareString)
{
// A match found near the beginning of a string is scored more than a match found near the end
@@ -304,6 +313,14 @@ namespace Flow.Launcher.Infrastructure
// while the score is lower if they are more spread out
var score = 100 * (query.Length + 1) / ((1 + firstIndex) + (matchLen + 1));
+ // Give more weight to a match that is closer to the start of the string.
+ // if the first matched char is immediately before space and all strings are contained in the compare string e.g. 'world' matching 'hello world'
+ // and 'world hello', because both have 'world' immediately preceded by space, their firstIndex will be 0 when distance is calculated,
+ // to prevent them scoring the same, we adjust the score by deducting the number of spaces it has from the start of the string, so 'world hello'
+ // will score slightly higher than 'hello world' because 'hello world' has one additional space.
+ if (firstIndex == 0 && allSubstringsContainedInCompareString)
+ score -= spaceIndices.Count;
+
// A match with less characters assigning more weights
if (stringToCompare.Length - query.Length < 5)
{
diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
new file mode 100644
index 000000000..71020369a
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Text.Json.Serialization;
+
+namespace Flow.Launcher.Infrastructure.UserSettings
+{
+ public abstract class ShortcutBaseModel
+ {
+ public string Key { get; set; }
+
+ [JsonIgnore]
+ public Func Expand { get; set; } = () => { return ""; };
+
+ public override bool Equals(object obj)
+ {
+ return obj is ShortcutBaseModel other &&
+ Key == other.Key;
+ }
+
+ public override int GetHashCode()
+ {
+ return Key.GetHashCode();
+ }
+ }
+
+ public class CustomShortcutModel : ShortcutBaseModel
+ {
+ public string Value { get; set; }
+
+ [JsonConstructorAttribute]
+ public CustomShortcutModel(string key, string value)
+ {
+ Key = key;
+ Value = value;
+ Expand = () => { return Value; };
+ }
+
+ public void Deconstruct(out string key, out string value)
+ {
+ key = Key;
+ value = Value;
+ }
+
+ public static implicit operator (string Key, string Value)(CustomShortcutModel shortcut)
+ {
+ return (shortcut.Key, shortcut.Value);
+ }
+
+ public static implicit operator CustomShortcutModel((string Key, string Value) shortcut)
+ {
+ return new CustomShortcutModel(shortcut.Key, shortcut.Value);
+ }
+ }
+
+ public class BuiltinShortcutModel : ShortcutBaseModel
+ {
+ public string Description { get; set; }
+
+ public BuiltinShortcutModel(string key, string description, Func expand)
+ {
+ Key = key;
+ Description = description;
+ Expand = expand ?? (() => { return ""; });
+ }
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/DataLocation.cs b/Flow.Launcher.Infrastructure/UserSettings/DataLocation.cs
index e93c341dc..e294f52b8 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/DataLocation.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/DataLocation.cs
@@ -1,9 +1,5 @@
-using System;
-using System.Collections.Generic;
+using System;
using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@@ -31,5 +27,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public static readonly string PluginsDirectory = Path.Combine(DataDirectory(), Constant.Plugins);
public static readonly string PluginSettingsDirectory = Path.Combine(DataDirectory(), "Settings", Constant.Plugins);
+
+ public const string PythonEnvironmentName = "Python";
+ public const string NodeEnvironmentName = "Node.js";
+ public const string PluginEnvironments = "Environments";
+ public static readonly string PluginEnvironmentsPath = Path.Combine(DataDirectory(), PluginEnvironments);
}
}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
index c06e1587d..130e25d7b 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
@@ -1,11 +1,34 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Infrastructure.UserSettings
{
public class PluginsSettings : BaseModel
{
+ private string pythonExecutablePath = string.Empty;
+ public string PythonExecutablePath {
+ get { return pythonExecutablePath; }
+ set
+ {
+ pythonExecutablePath = value;
+ Constant.PythonPath = value;
+ }
+ }
+
+ private string nodeExecutablePath = string.Empty;
+ public string NodeExecutablePath
+ {
+ get { return nodeExecutablePath; }
+ set
+ {
+ nodeExecutablePath = value;
+ Constant.NodePath = value;
+ }
+ }
+
+ // TODO: Remove. This is backwards compatibility for 1.10.0 release.
public string PythonDirectory { get; set; }
+
public Dictionary Plugins { get; set; } = new Dictionary();
public void UpdatePluginSettings(List metadatas)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 8ecd6dc4b..7f62d82c8 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -1,11 +1,11 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Text.Json.Serialization;
+using System.Windows;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
-using Flow.Launcher;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Infrastructure.UserSettings
@@ -13,11 +13,13 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public class Settings : BaseModel
{
private string language = "en";
+ private string _theme = Constant.DefaultTheme;
public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}";
public string OpenResultModifiers { get; set; } = KeyConstant.Alt;
public string ColorScheme { get; set; } = "System";
public bool ShowOpenResultHotkey { get; set; } = true;
public double WindowSize { get; set; } = 580;
+ public string PreviewHotkey { get; set; } = $"F1";
public string Language
{
@@ -28,7 +30,18 @@ namespace Flow.Launcher.Infrastructure.UserSettings
OnPropertyChanged();
}
}
- public string Theme { get; set; } = Constant.DefaultTheme;
+ public string Theme
+ {
+ get => _theme;
+ set
+ {
+ if (value == _theme)
+ return;
+ _theme = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(MaxResultsToShow));
+ }
+ }
public bool UseDropShadowEffect { get; set; } = false;
public string QueryBoxFont { get; set; } = FontFamily.GenericSansSerif.Name;
public string QueryBoxFontStyle { get; set; }
@@ -41,8 +54,18 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
+ public bool UseClock { get; set; } = true;
+ public bool UseDate { get; set; } = false;
+ public string TimeFormat { get; set; } = "hh:mm tt";
+ public string DateFormat { get; set; } = "MM'/'dd ddd";
public bool FirstLaunch { get; set; } = true;
+ public double SettingWindowWidth { get; set; } = 1000;
+ public double SettingWindowHeight { get; set; } = 700;
+ public double SettingWindowTop { get; set; }
+ public double SettingWindowLeft { get; set; }
+ public System.Windows.WindowState SettingWindowState { get; set; } = WindowState.Normal;
+
public int CustomExplorerIndex { get; set; } = 0;
[JsonIgnore]
@@ -120,8 +143,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
PrivateArg = "-private",
EnablePrivate = false,
Editable = false
- }
- ,
+ },
new()
{
Name = "MS Edge",
@@ -137,6 +159,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
/// when false Alphabet static service will always return empty results
///
public bool ShouldUsePinyin { get; set; } = false;
+ public bool AlwaysPreview { get; set; } = false;
+ public bool AlwaysStartEn { get; set; } = false;
[JsonInclude, JsonConverter(typeof(JsonStringEnumConverter))]
public SearchPrecisionScore QuerySearchPrecision { get; private set; } = SearchPrecisionScore.Regular;
@@ -171,12 +195,32 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public double WindowLeft { get; set; }
public double WindowTop { get; set; }
+
+ ///
+ /// Custom left position on selected monitor
+ ///
+ public double CustomWindowLeft { get; set; } = 0;
+
+ ///
+ /// Custom top position on selected monitor
+ ///
+ public double CustomWindowTop { get; set; } = 0;
+
public int MaxResultsToShow { get; set; } = 5;
public int ActivateTimes { get; set; }
public ObservableCollection CustomPluginHotkeys { get; set; } = new ObservableCollection();
+ public ObservableCollection CustomShortcuts { get; set; } = new ObservableCollection();
+
+ [JsonIgnore]
+ public ObservableCollection BuiltinShortcuts { get; set; } = new()
+ {
+ new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText),
+ new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath)
+ };
+
public bool DontPromptUpdateMsg { get; set; }
public bool EnableUpdateLog { get; set; }
@@ -193,8 +237,16 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
public bool LeaveCmdOpen { get; set; }
- public bool HideWhenDeactive { get; set; } = true;
- public bool RememberLastLaunchLocation { get; set; }
+ public bool HideWhenDeactivated { get; set; } = true;
+
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public SearchWindowScreens SearchWindowScreen { get; set; } = SearchWindowScreens.RememberLastLaunchLocation;
+
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public SearchWindowAligns SearchWindowAlign { get; set; } = SearchWindowAligns.Center;
+
+ public int CustomScreenNumber { get; set; } = 1;
+
public bool IgnoreHotkeysOnFullscreen { get; set; }
public HttpProxy Proxy { get; set; } = new HttpProxy();
@@ -220,4 +272,22 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Light,
Dark
}
-}
\ No newline at end of file
+
+ public enum SearchWindowScreens
+ {
+ RememberLastLaunchLocation,
+ Cursor,
+ Focus,
+ Primary,
+ Custom
+ }
+
+ public enum SearchWindowAligns
+ {
+ Center,
+ CenterTop,
+ LeftTop,
+ RightTop,
+ Custom
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/pinyindb/pinyin_gwoyeu_mapping.xml b/Flow.Launcher.Infrastructure/pinyindb/pinyin_gwoyeu_mapping.xml
deleted file mode 100644
index 2713c2d53..000000000
--- a/Flow.Launcher.Infrastructure/pinyindb/pinyin_gwoyeu_mapping.xml
+++ /dev/null
@@ -1,3283 +0,0 @@
-
-
- -
- a
- a
- ar
- aa
- ah
- .a
-
- -
- ai
- ai
- air
- ae
- ay
- .ai
-
- -
- an
- an
- arn
- aan
- ann
- .an
-
- -
- ang
- ang
- arng
- aang
- anq
- .ang
-
- -
- ao
- au
- aur
- ao
- aw
- .au
-
- -
- ba
- ba
- bar
- baa
- bah
- .ba
-
- -
- bai
- bai
- bair
- bae
- bay
- .bai
-
- -
- ban
- ban
- barn
- baan
- bann
- .ban
-
- -
- bang
- bang
- barng
- baang
- banq
- .bang
-
- -
- bao
- bau
- baur
- bao
- baw
- .bau
-
- -
- bei
- bei
- beir
- beei
- bey
- .bei
-
- -
- ben
- ben
- bern
- been
- benn
- .ben
-
- -
- beng
- beng
- berng
- beeng
- benq
- .beng
-
- -
- bi
- bi
- byi
- bii
- bih
- .bi
-
- -
- bian
- bian
- byan
- bean
- biann
- .bian
-
- -
- biao
- biau
- byau
- beau
- biaw
- .biau
-
- -
- bie
- bie
- bye
- biee
- bieh
- .bie
-
- -
- bin
- bin
- byn
- biin
- binn
- .bin
-
- -
- bing
- bing
- byng
- biing
- binq
- .bing
-
- -
- bo
- bo
- bor
- boo
- boh
- .bo
-
- -
- bu
- bu
- bwu
- buu
- buh
- .bu
-
- -
- ca
- tsa
- tsar
- tsaa
- tsah
- .tsa
-
- -
- cai
- tsai
- tsair
- tsae
- tsay
- .tsai
-
- -
- can
- tsan
- tsarn
- tsaan
- tsann
- .tsan
-
- -
- cang
- tsang
- tsarng
- tsaang
- tsanq
- .tsang
-
- -
- cao
- tsau
- tsaur
- tsao
- tsaw
- .tsau
-
- -
- ce
- tse
- tser
- tsee
- tseh
- .tse
-
- -
- cen
- tsen
- tsern
- tseen
- tsenn
- .tsen
-
- -
- ceng
- tseng
- tserng
- tseeng
- tsenq
- .tseng
-
- -
- cha
- cha
- char
- chaa
- chah
- .cha
-
- -
- chai
- chai
- chair
- chae
- chay
- .chai
-
- -
- chan
- chan
- charn
- chaan
- chann
- .chan
-
- -
- chang
- chang
- charng
- chaang
- chanq
- .chang
-
- -
- chao
- chau
- chaur
- chao
- chaw
- .chau
-
- -
- che
- che
- cher
- chee
- cheh
- .che
-
- -
- chen
- chen
- chern
- cheen
- chenn
- .chen
-
- -
- cheng
- cheng
- cherng
- cheeng
- chenq
- .cheng
-
- -
- chi
- chy
- chyr
- chyy
- chyh
- .chy
-
- -
- chong
- chong
- chorng
- choong
- chonq
- .chong
-
- -
- chou
- chou
- chour
- choou
- chow
- .chou
-
- -
- chu
- chu
- chwu
- chuu
- chuh
- .chu
-
- -
- chua
- chua
- chuar
- chuaa
- chuah
- .chua
-
- -
- chuai
- chuai
- chwai
- choai
- chuay
- .chuai
-
- -
- chuan
- chuan
- chwan
- choan
- chuann
- .chuan
-
- -
- chuang
- chuang
- chwang
- choang
- chuanq
- .chuang
-
- -
- chui
- chuei
- chwei
- choei
- chuey
- .chuei
-
- -
- chun
- chuen
- chwen
- choen
- chuenn
- .chuen
-
- -
- chuo
- chuo
- chwo
- chuoo
- chuoh
- .chuo
-
- -
- qi
- chi
- chyi
- chii
- chih
- .chi
-
- -
- qia
- chia
- chya
- chea
- chiah
- .chia
-
- -
- qian
- chian
- chyan
- chean
- chiann
- .chian
-
- -
- qiang
- chiang
- chyang
- cheang
- chianq
- .chiang
-
- -
- qiao
- chiau
- chyau
- cheau
- chiaw
- .chiau
-
- -
- qie
- chie
- chye
- chiee
- chieh
- .chie
-
- -
- ci
- tsy
- tsyr
- tsyy
- tsyh
- .tsy
-
- -
- qin
- chin
- chyn
- chiin
- chinn
- .chin
-
- -
- qing
- ching
- chyng
- chiing
- chinq
- .ching
-
- -
- qiu
- chiou
- chyou
- cheou
- chiow
- .chiou
-
- -
- cong
- tsong
- tsorng
- tsoong
- tsonq
- .tsong
-
- -
- cou
- tsou
- tsour
- tsoou
- tsow
- .tsou
-
- -
- cu
- tsu
- tswu
- tsuu
- tsuh
- .tsu
-
- -
- cuan
- tsuan
- tswan
- tsoan
- tsuann
- .tsuan
-
- -
- cui
- tsuei
- tswei
- tsoei
- tsuey
- .tsuei
-
- -
- cun
- tsuen
- tswen
- tsoen
- tsuenn
- .tsuen
-
- -
- cuo
- tsuo
- tswo
- tsuoo
- tsuoh
- .tsuo
-
- -
- qiong
- chiong
- chyong
- cheong
- chionq
- .chiong
-
- -
- qu
- chiu
- chyu
- cheu
- chiuh
- .chiu
-
- -
- quan
- chiuan
- chyuan
- cheuan
- chiuann
- .chiuan
-
- -
- que
- chiue
- chyue
- cheue
- chiueh
- .chiue
-
- -
- qun
- chiun
- chyun
- cheun
- chiunn
- .chiun
-
- -
- da
- da
- dar
- daa
- dah
- .da
-
- -
- dai
- dai
- dair
- dae
- day
- .dai
-
- -
- dan
- dan
- darn
- daan
- dann
- .dan
-
- -
- dang
- dang
- darng
- daang
- danq
- .dang
-
- -
- dao
- dau
- daur
- dao
- daw
- .dau
-
- -
- de
- de
- der
- dee
- deh
- .de
-
- -
- dei
- dei
- deir
- deei
- dey
- .dei
-
- -
- den
- den
- dern
- deen
- denn
- .den
-
- -
- deng
- deng
- derng
- deeng
- denq
- .deng
-
- -
- di
- di
- dyi
- dii
- dih
- .di
-
- -
- dian
- dian
- dyan
- dean
- diann
- .dian
-
- -
- diang
- diang
- dyang
- deang
- dianq
- .diang
-
- -
- diao
- diau
- dyau
- deau
- diaw
- .diau
-
- -
- die
- die
- dye
- diee
- dieh
- .die
-
- -
- ding
- ding
- dyng
- diing
- dinq
- .ding
-
- -
- diu
- diou
- dyou
- deou
- diow
- .diou
-
- -
- dong
- dong
- dorng
- doong
- donq
- .dong
-
- -
- dou
- dou
- dour
- doou
- dow
- .dou
-
- -
- du
- du
- dwu
- duu
- duh
- .du
-
- -
- duan
- duan
- dwan
- doan
- duann
- .duan
-
- -
- dui
- duei
- dwei
- doei
- duey
- .duei
-
- -
- dun
- duen
- dwen
- doen
- duenn
- .duen
-
- -
- duo
- duo
- dwo
- duoo
- duoh
- .duo
-
- -
- e
- e
- er
- ee
- eh
- .e
-
- -
- ei
- ei
- eir
- eei
- ey
- .ei
-
- -
- en
- en
- ern
- een
- enn
- .en
-
- -
- er
- el
- erl
- eel
- ell
- .el
-
- -
- fa
- fa
- far
- faa
- fah
- .fa
-
- -
- fan
- fan
- farn
- faan
- fann
- .fan
-
- -
- fang
- fang
- farng
- faang
- fanq
- .fang
-
- -
- fei
- fei
- feir
- feei
- fey
- .fei
-
- -
- fen
- fen
- fern
- feen
- fenn
- .fen
-
- -
- fo
- fo
- for
- foo
- foh
- .fo
-
- -
- feng
- feng
- ferng
- feeng
- fenq
- .feng
-
- -
- fou
- fou
- four
- foou
- fow
- .fou
-
- -
- fu
- fu
- fwu
- fuu
- fuh
- .fu
-
- -
- ga
- ga
- gar
- gaa
- gah
- .ga
-
- -
- gai
- gai
- gair
- gae
- gay
- .gai
-
- -
- gan
- gan
- garn
- gaan
- gann
- .gan
-
- -
- gang
- gang
- garng
- gaang
- ganq
- .gang
-
- -
- gao
- gau
- gaur
- gao
- gaw
- .gau
-
- -
- ge
- ge
- ger
- gee
- geh
- .ge
-
- -
- gei
- gei
- geir
- geei
- gey
- .gei
-
- -
- gen
- gen
- gern
- geen
- genn
- .gen
-
- -
- geng
- geng
- gerng
- geeng
- genq
- .geng
-
- -
- gong
- gong
- gorng
- goong
- gonq
- .gong
-
- -
- gou
- gou
- gour
- goou
- gow
- .gou
-
- -
- gu
- gu
- gwu
- guu
- guh
- .gu
-
- -
- gua
- gua
- gwa
- goa
- guah
- .gua
-
- -
- guai
- guai
- gwai
- goai
- guay
- .guai
-
- -
- guan
- guan
- gwan
- goan
- guann
- .guan
-
- -
- guang
- guang
- gwang
- goang
- guanq
- .guang
-
- -
- gui
- guei
- gwei
- goei
- guey
- .guei
-
- -
- gun
- guen
- gwen
- goen
- guenn
- .guen
-
- -
- guo
- guo
- gwo
- guoo
- guoh
- .guo
-
- -
- ha
- ha
- har
- haa
- hah
- .ha
-
- -
- hai
- hai
- hair
- hae
- hay
- .hai
-
- -
- han
- han
- harn
- haan
- hann
- .han
-
- -
- hang
- hang
- harng
- haang
- hanq
- .hang
-
- -
- hao
- hau
- haur
- hao
- haw
- .hau
-
- -
- he
- he
- her
- hee
- heh
- .he
-
- -
- hei
- hei
- heir
- heei
- hey
- .hei
-
- -
- hen
- hen
- hern
- heen
- henn
- .hen
-
- -
- heng
- heng
- herng
- heeng
- henq
- .heng
-
- -
- hong
- hong
- horng
- hoong
- honq
- .hong
-
- -
- hou
- hou
- hour
- hoou
- how
- .hou
-
- -
- hu
- hu
- hwu
- huu
- huh
- .hu
-
- -
- hua
- hua
- hwa
- hoa
- huah
- .hua
-
- -
- huai
- huai
- hwai
- hoai
- huay
- .huai
-
- -
- huan
- huan
- hwan
- hoan
- huann
- .huan
-
- -
- huang
- huang
- hwang
- hoang
- huanq
- .huang
-
- -
- hui
- huei
- hwei
- hoei
- huey
- .huei
-
- -
- hun
- huen
- hwen
- hoen
- huenn
- .huen
-
- -
- huo
- huo
- hwo
- huoo
- huoh
- .huo
-
- -
- zha
- ja
- jar
- jaa
- jah
- .ja
-
- -
- zhai
- jai
- jair
- jae
- jay
- .jai
-
- -
- zhan
- jan
- jarn
- jaan
- jann
- .jan
-
- -
- zhang
- jang
- jarng
- jaang
- janq
- .jang
-
- -
- zhao
- jau
- jaur
- jao
- jaw
- .jau
-
- -
- zhe
- je
- jer
- jee
- jeh
- .je
-
- -
- zhei
- jei
- jeir
- jeei
- jey
- .jei
-
- -
- zhen
- jen
- jern
- jeen
- jenn
- .jen
-
- -
- zheng
- jeng
- jerng
- jeeng
- jenq
- .jeng
-
- -
- zhi
- jy
- jyr
- jyy
- jyh
- .jy
-
- -
- zhong
- jong
- jorng
- joong
- jonq
- .jong
-
- -
- zhou
- jou
- jour
- joou
- jow
- .jou
-
- -
- zhu
- ju
- jwu
- juu
- juh
- .ju
-
- -
- zhua
- jua
- jwa
- joa
- juah
- .jua
-
- -
- zhuai
- juai
- jwai
- joai
- juay
- .juai
-
- -
- zhuan
- juan
- jwan
- joan
- juann
- .juan
-
- -
- zhuang
- juang
- jwang
- joang
- juanq
- .juang
-
- -
- zhui
- juei
- jwei
- joei
- juey
- .juei
-
- -
- zhun
- juen
- jwen
- joen
- juenn
- .juen
-
- -
- zhuo
- juo
- jwo
- juoo
- juoh
- .juo
-
- -
- ji
- ji
- jyi
- jii
- jih
- .ji
-
- -
- jia
- jia
- jya
- jea
- jiah
- .jia
-
- -
- jian
- jian
- jyan
- jean
- jiann
- .jian
-
- -
- jiang
- jiang
- jyang
- jeang
- jianq
- .jiang
-
- -
- jiao
- jiau
- jyau
- jeau
- jiaw
- .jiau
-
- -
- jie
- jie
- jye
- jiee
- jieh
- .jie
-
- -
- jin
- jin
- jyn
- jiin
- jinn
- .jin
-
- -
- jing
- jing
- jyng
- jiing
- jinq
- .jing
-
- -
- jiu
- jiou
- jyou
- jeou
- jiow
- .jiou
-
- -
- jiong
- jiong
- jyong
- jeong
- jionq
- .jiong
-
- -
- ju
- jiu
- jyu
- jeu
- jiuh
- .jiu
-
- -
- juan
- jiuan
- jyuan
- jeuan
- jiuann
- .jiuan
-
- -
- jue
- jiue
- jyue
- jeue
- jiueh
- .jiue
-
- -
- jun
- jiun
- jyun
- jeun
- jiunn
- .jiun
-
- -
- ka
- ka
- kar
- kaa
- kah
- .ka
-
- -
- kai
- kai
- kair
- kae
- kay
- .kai
-
- -
- kan
- kan
- karn
- kaan
- kann
- .kan
-
- -
- kang
- kang
- karng
- kaang
- kanq
- .kang
-
- -
- kao
- kau
- kaur
- kao
- kaw
- .kau
-
- -
- ke
- ke
- ker
- kee
- keh
- .ke
-
- -
- ken
- ken
- kern
- keen
- kenn
- .ken
-
- -
- keng
- keng
- kerng
- keeng
- kenq
- .keng
-
- -
- kong
- kong
- korng
- koong
- konq
- .kong
-
- -
- kou
- kou
- kour
- koou
- kow
- .kou
-
- -
- ku
- ku
- kwu
- kuu
- kuh
- .ku
-
- -
- kua
- kua
- kwa
- koa
- kuah
- .kua
-
- -
- kuai
- kuai
- kwai
- koai
- kuay
- .kuai
-
- -
- kuan
- kuan
- kwan
- koan
- kuann
- .kuan
-
- -
- kuang
- kuang
- kwang
- koang
- kuanq
- .kuang
-
- -
- kui
- kuei
- kwei
- koei
- kuey
- .kuei
-
- -
- kun
- kuen
- kwen
- koen
- kuenn
- .kuen
-
- -
- kuo
- kuo
- kwo
- kuoo
- kuoh
- .kuo
-
- -
- la
- lha
- la
- laa
- lah
- .lha
-
- -
- lai
- lhai
- lai
- lae
- lay
- .lhai
-
- -
- lan
- lhan
- lan
- laan
- lann
- .lhan
-
- -
- lang
- lhang
- lang
- laang
- lanq
- .lhang
-
- -
- lao
- lhau
- lau
- lao
- law
- .lhau
-
- -
- le
- lhe
- le
- lee
- leh
- .lhe
-
- -
- lei
- lhei
- lei
- leei
- ley
- .lhei
-
- -
- leng
- lheng
- leng
- leeng
- lenq
- .lheng
-
- -
- li
- lhi
- li
- lii
- lih
- .lhi
-
- -
- lia
- lhia
- lia
- lea
- liah
- .lhia
-
- -
- lian
- lhian
- lian
- lean
- liann
- .lhian
-
- -
- liang
- lhiang
- liang
- leang
- lianq
- .lhiang
-
- -
- liao
- lhiau
- liau
- leau
- liaw
- .lhiau
-
- -
- lie
- lhie
- lie
- liee
- lieh
- .lhie
-
- -
- lin
- lhin
- lin
- liin
- linn
- .lhin
-
- -
- ling
- lhing
- ling
- liing
- linq
- .lhing
-
- -
- liu
- lhiou
- liou
- leou
- liow
- .lhiou
-
- -
- lo
- lo
- lor
- loo
- loh
- .lo
-
- -
- long
- lhong
- long
- loong
- lonq
- .lhong
-
- -
- lou
- lhou
- lou
- loou
- low
- .lhou
-
- -
- lu
- lhu
- lu
- luu
- luh
- .lhu
-
- -
- luan
- lhuan
- luan
- loan
- luann
- .lhuan
-
- -
- lun
- lhuen
- luen
- loen
- luenn
- .lhuen
-
- -
- luo
- lhuo
- luo
- luoo
- luoh
- .lhuo
-
- -
- lu:
- lhiu
- liu
- leu
- liuh
- .lhiu
-
- -
- lu:e
- lhiue
- liue
- leue
- liueh
- .lhiue
-
- -
- lu:n
- lhiun
- liun
- leun
- liunn
- .lhiun
-
- -
- ma
- mha
- ma
- maa
- mah
- .mha
-
- -
- mai
- mhai
- mai
- mae
- may
- .mhai
-
- -
- man
- mhan
- man
- maan
- mann
- .mhan
-
- -
- mang
- mhang
- mang
- maang
- manq
- .mhang
-
- -
- mao
- mhau
- mau
- mao
- maw
- .mhau
-
- -
- me
- me
- mer
- mee
- meh
- .me
-
- -
- mei
- mhei
- mei
- meei
- mey
- .mhei
-
- -
- men
- mhen
- men
- meen
- menn
- .mhen
-
- -
- meng
- mheng
- meng
- meeng
- menq
- .mheng
-
- -
- mi
- mhi
- mi
- mii
- mih
- .mhi
-
- -
- mian
- mhian
- mian
- mean
- miann
- .mhian
-
- -
- miao
- mhiau
- miau
- meau
- miaw
- .mhiau
-
- -
- mie
- mhie
- mie
- miee
- mieh
- .mhie
-
- -
- min
- mhin
- min
- miin
- minn
- .mhin
-
- -
- ming
- mhing
- ming
- miing
- minq
- .mhing
-
- -
- miu
- mhiou
- miou
- meou
- miow
- .mhiou
-
- -
- mo
- mho
- mo
- moo
- moh
- .mho
-
- -
- mou
- mhou
- mou
- moou
- mow
- .mhou
-
- -
- mu
- mhu
- mu
- muu
- muh
- .mhu
-
- -
- na
- nha
- na
- naa
- nah
- .nha
-
- -
- nai
- nhai
- nai
- nae
- nay
- .nhai
-
- -
- nan
- nhan
- nan
- naan
- nann
- .nhan
-
- -
- nang
- nhang
- nang
- naang
- nanq
- .nhang
-
- -
- nao
- nhau
- nau
- nao
- naw
- .nhau
-
- -
- ne
- nhe
- ne
- nee
- neh
- .nhe
-
- -
- nei
- nhei
- nei
- neei
- ney
- .nhei
-
- -
- nen
- nhen
- nen
- neen
- nenn
- .nhen
-
- -
- neng
- nheng
- neng
- neeng
- nenq
- .nheng
-
- -
- ni
- nhi
- ni
- nii
- nih
- .nhi
-
- -
- nia
- nia
- niar
- niaa
- niah
- .nia
-
- -
- nian
- nhian
- nian
- nean
- niann
- .nhian
-
- -
- niang
- nhiang
- niang
- neang
- nianq
- .nhiang
-
- -
- niao
- nhiau
- niau
- neau
- niaw
- .nhiau
-
- -
- nie
- nhie
- nie
- niee
- nieh
- .nhie
-
- -
- nin
- nhin
- nin
- niin
- ninn
- .nhin
-
- -
- ning
- nhing
- ning
- niing
- ninq
- .nhing
-
- -
- niu
- nhiou
- niou
- neou
- niow
- .nhiou
-
- -
- nong
- nhong
- nong
- noong
- nonq
- .nhong
-
- -
- nou
- nhou
- nou
- noou
- now
- .nhou
-
- -
- nu
- nhu
- nu
- nuu
- nuh
- .nhu
-
- -
- nuan
- nhuan
- nuan
- noan
- nuann
- .nhuan
-
- -
- nun
- nhuen
- nuen
- noen
- nuenn
- .nhuen
-
- -
- nuo
- nhuo
- nuo
- nuoo
- nuoh
- .nhuo
-
- -
- nu:
- nhiu
- niu
- neu
- niuh
- .nhiu
-
- -
- nu:e
- nhiue
- niue
- neue
- niueh
- .nhiue
-
- -
- ou
- ou
- our
- oou
- ow
- .ou
-
- -
- pa
- pa
- par
- paa
- pah
- .pa
-
- -
- pai
- pai
- pair
- pae
- pay
- .pai
-
- -
- pan
- pan
- parn
- paan
- pann
- .pan
-
- -
- pang
- pang
- parng
- paang
- panq
- .pang
-
- -
- pao
- pau
- paur
- pao
- paw
- .pau
-
- -
- pei
- pei
- peir
- peei
- pey
- .pei
-
- -
- pen
- pen
- pern
- peen
- penn
- .pen
-
- -
- peng
- peng
- perng
- peeng
- penq
- .peng
-
- -
- pi
- pi
- pyi
- pii
- pih
- .pi
-
- -
- pian
- pian
- pyan
- pean
- piann
- .pian
-
- -
- piao
- piau
- pyau
- peau
- piaw
- .piau
-
- -
- pie
- pie
- pye
- piee
- pieh
- .pie
-
- -
- pin
- pin
- pyn
- piin
- pinn
- .pin
-
- -
- ping
- ping
- pyng
- piing
- pinq
- .ping
-
- -
- po
- po
- por
- poo
- poh
- .po
-
- -
- pou
- pou
- pour
- poou
- pow
- .pou
-
- -
- pu
- pu
- pwu
- puu
- puh
- .pu
-
- -
- ran
- rhan
- ran
- raan
- rann
- .rhan
-
- -
- rang
- rhang
- rang
- raang
- ranq
- .rhang
-
- -
- rao
- rhau
- rau
- rao
- raw
- .rhau
-
- -
- re
- rhe
- re
- ree
- reh
- .rhe
-
- -
- ren
- rhen
- ren
- reen
- renn
- .rhen
-
- -
- reng
- rheng
- reng
- reeng
- renq
- .rheng
-
- -
- ri
- rhy
- ry
- ryy
- ryh
- .rhy
-
- -
- rong
- rhong
- rong
- roong
- ronq
- .rhong
-
- -
- rou
- rhou
- rou
- roou
- row
- .rhou
-
- -
- ru
- rhu
- ru
- ruu
- ruh
- .rhu
-
- -
- ruan
- rhuan
- ruan
- roan
- ruann
- .rhuan
-
- -
- rui
- rhuei
- ruei
- roei
- ruey
- .rhuei
-
- -
- run
- rhuen
- ruen
- roen
- ruenn
- .rhuen
-
- -
- ruo
- rhuo
- ruo
- ruoo
- ruoh
- .rhuo
-
- -
- sa
- sa
- sar
- saa
- sah
- .sa
-
- -
- sai
- sai
- sair
- sae
- say
- .sai
-
- -
- san
- san
- sarn
- saan
- sann
- .san
-
- -
- sang
- sang
- sarng
- saang
- sanq
- .sang
-
- -
- sao
- sau
- saur
- sao
- saw
- .sau
-
- -
- se
- se
- ser
- see
- seh
- .se
-
- -
- sei
- sei
- seir
- seei
- sey
- .sei
-
- -
- sen
- sen
- sern
- seen
- senn
- .sen
-
- -
- seng
- seng
- serng
- seeng
- senq
- .seng
-
- -
- sha
- sha
- shar
- shaa
- shah
- .sha
-
- -
- shai
- shai
- shair
- shae
- shay
- .shai
-
- -
- shan
- shan
- sharn
- shaan
- shann
- .shan
-
- -
- shang
- shang
- sharng
- shaang
- shanq
- .shang
-
- -
- shao
- shau
- shaur
- shao
- shaw
- .shau
-
- -
- she
- she
- sher
- shee
- sheh
- .she
-
- -
- shei
- shei
- sheir
- sheei
- shey
- .shei
-
- -
- shen
- shen
- shern
- sheen
- shenn
- .shen
-
- -
- sheng
- sheng
- sherng
- sheeng
- shenq
- .sheng
-
- -
- shi
- shy
- shyr
- shyy
- shyh
- .shy
-
- -
- shong
- shong
- shorng
- shoong
- shonq
- .shong
-
- -
- shou
- shou
- shour
- shoou
- show
- .shou
-
- -
- shu
- shu
- shwu
- shuu
- shuh
- .shu
-
- -
- shua
- shua
- shwa
- shoa
- shuah
- .shua
-
- -
- shuai
- shuai
- shwai
- shoai
- shuay
- .shuai
-
- -
- shuan
- shuan
- shwan
- shoan
- shuann
- .shuan
-
- -
- shuang
- shuang
- shwang
- shoang
- shuanq
- .shuang
-
- -
- shui
- shuei
- shwei
- shoei
- shuey
- .shuei
-
- -
- shun
- shuen
- shwen
- shoen
- shuenn
- .shuen
-
- -
- shuo
- shuo
- shwo
- shuoo
- shuoh
- .shuo
-
- -
- xi
- shi
- shyi
- shii
- shih
- .shi
-
- -
- xia
- shia
- shya
- shea
- shiah
- .shia
-
- -
- xian
- shian
- shyan
- shean
- shiann
- .shian
-
- -
- xiang
- shiang
- shyang
- sheang
- shianq
- .shiang
-
- -
- xiao
- shiau
- shyau
- sheau
- shiaw
- .shiau
-
- -
- xie
- shie
- shye
- shiee
- shieh
- .shie
-
- -
- si
- sy
- syr
- syy
- syh
- .sy
-
- -
- xin
- shin
- shyn
- shiin
- shinn
- .shin
-
- -
- xing
- shing
- shyng
- shiing
- shinq
- .shing
-
- -
- xiu
- shiou
- shyou
- sheou
- shiow
- .shiou
-
- -
- song
- song
- sorng
- soong
- sonq
- .song
-
- -
- sou
- sou
- sour
- soou
- sow
- .sou
-
- -
- su
- su
- swu
- suu
- suh
- .su
-
- -
- suan
- suan
- swan
- soan
- suann
- .suan
-
- -
- sui
- suei
- swei
- soei
- suey
- .suei
-
- -
- sun
- suen
- swen
- soen
- suenn
- .suen
-
- -
- suo
- suo
- swo
- suoo
- suoh
- .suo
-
- -
- xiong
- shiong
- shyong
- sheong
- shionq
- .shiong
-
- -
- xu
- shiu
- shyu
- sheu
- shiuh
- .shiu
-
- -
- xuan
- shiuan
- shyuan
- sheuan
- shiuann
- .shiuan
-
- -
- xue
- shiue
- shyue
- sheue
- shiueh
- .shiue
-
- -
- xun
- shiun
- shyun
- sheun
- shiunn
- .shiun
-
- -
- ta
- ta
- tar
- taa
- tah
- .ta
-
- -
- tai
- tai
- tair
- tae
- tay
- .tai
-
- -
- tan
- tan
- tarn
- taan
- tann
- .tan
-
- -
- tang
- tang
- tarng
- taang
- tanq
- .tang
-
- -
- tao
- tau
- taur
- tao
- taw
- .tau
-
- -
- te
- te
- ter
- tee
- teh
- .te
-
- -
- teng
- teng
- terng
- teeng
- tenq
- .teng
-
- -
- ti
- ti
- tyi
- tii
- tih
- .ti
-
- -
- tian
- tian
- tyan
- tean
- tiann
- .tian
-
- -
- tiao
- tiau
- tyau
- teau
- tiaw
- .tiau
-
- -
- tie
- tie
- tye
- tiee
- tieh
- .tie
-
- -
- ting
- ting
- tyng
- tiing
- tinq
- .ting
-
- -
- tong
- tong
- torng
- toong
- tonq
- .tong
-
- -
- tou
- tou
- tour
- toou
- tow
- .tou
-
- -
- tu
- tu
- twu
- tuu
- tuh
- .tu
-
- -
- tuan
- tuan
- twan
- toan
- tuann
- .tuan
-
- -
- tui
- tuei
- twei
- toei
- tuey
- .tuei
-
- -
- tun
- tuen
- twen
- toen
- tuenn
- .tuen
-
- -
- tuo
- tuo
- two
- tuoo
- tuoh
- .tuo
-
- -
- wa
- ua
- wa
- waa
- wah
- .ua
-
- -
- wai
- uai
- wai
- woai
- way
- .uai
-
- -
- wan
- uan
- wan
- woan
- wann
- .uan
-
- -
- wang
- uang
- wang
- woang
- wanq
- .uang
-
- -
- wei
- uei
- wei
- woei
- wey
- .uei
-
- -
- wo
- uo
- wo
- woo
- woh
- .uo
-
- -
- weng
- ueng
- weng
- woeng
- wenq
- .ueng
-
- -
- wu
- u
- wu
- wuu
- wuh
- .u
-
- -
- wen
- uen
- wen
- woen
- wenn
- .uen
-
- -
- ya
- ia
- ya
- yea
- yah
- .ia
-
- -
- yan
- ian
- yan
- yean
- yann
- .ian
-
- -
- yang
- iang
- yang
- yeang
- yanq
- .iang
-
- -
- yao
- iau
- yau
- yeau
- yaw
- .iau
-
- -
- ye
- ie
- ye
- yee
- yeh
- .ie
-
- -
- yi
- i
- yi
- yii
- yih
- .i
-
- -
- yin
- in
- yn
- yiin
- yinn
- .in
-
- -
- ying
- ing
- yng
- yiing
- yinq
- .ing
-
- -
- yong
- iong
- yong
- yeong
- yonq
- .iong
-
- -
- you
- iou
- you
- yeou
- yow
- .iou
-
- -
- yu
- iu
- yu
- yeu
- yuh
- .iu
-
- -
- yuan
- iuan
- yuan
- yeuan
- yuann
- .iuan
-
- -
- yue
- iue
- yue
- yeue
- yueh
- .iue
-
- -
- yun
- iun
- yun
- yeun
- yunn
- .iun
-
- -
- za
- tza
- tzar
- tzaa
- tzah
- .tza
-
- -
- zai
- tzai
- tzair
- tzae
- tzay
- .tzai
-
- -
- zan
- tzan
- tzarn
- tzaan
- tzann
- .tzan
-
- -
- zang
- tzang
- tzarng
- tzaang
- tzanq
- .tzang
-
- -
- zao
- tzau
- tzaur
- tzao
- tzaw
- .tzau
-
- -
- ze
- tze
- tzer
- tzee
- tzeh
- .tze
-
- -
- zei
- tzei
- tzeir
- tzeei
- tzey
- .tzei
-
- -
- zen
- tzen
- tzern
- tzeen
- tzenn
- .tzen
-
- -
- zeng
- tzeng
- tzerng
- tzeeng
- tzenq
- .tzeng
-
- -
- zi
- tzy
- tzyr
- tzyy
- tzyh
- .tzy
-
- -
- zong
- tzong
- tzorng
- tzoong
- tzonq
- .tzong
-
- -
- zou
- tzou
- tzour
- tzoou
- tzow
- .tzou
-
- -
- zu
- tzu
- tzwu
- tzuu
- tzuh
- .tzu
-
- -
- zuan
- tzuan
- tzwan
- tzoan
- tzuann
- .tzuan
-
- -
- zui
- tzuei
- tzwei
- tzoei
- tzuey
- .tzuei
-
- -
- zun
- tzuen
- tzwen
- tzoen
- tzuenn
- .tzuen
-
- -
- zuo
- tzuo
- tzwo
- tzuoo
- tzuoh
- .tzuo
-
-
diff --git a/Flow.Launcher.Infrastructure/pinyindb/pinyin_mapping.xml b/Flow.Launcher.Infrastructure/pinyindb/pinyin_mapping.xml
deleted file mode 100644
index 9143e0ca6..000000000
--- a/Flow.Launcher.Infrastructure/pinyindb/pinyin_mapping.xml
+++ /dev/null
@@ -1,2873 +0,0 @@
-
-
- -
- a
- a
- a
- a
- a
-
- -
- ai
- ai
- ai
- ai
- ai
-
- -
- an
- an
- an
- an
- an
-
- -
- ang
- ang
- ang
- ang
- ang
-
- -
- ao
- ao
- au
- au
- ao
-
- -
- ba
- pa
- ba
- ba
- ba
-
- -
- bai
- pai
- bai
- bai
- bai
-
- -
- ban
- pan
- ban
- ban
- ban
-
- -
- bang
- pang
- bang
- bang
- bang
-
- -
- bao
- pao
- bau
- bau
- bao
-
- -
- bei
- pei
- bei
- bei
- bei
-
- -
- ben
- pen
- ben
- ben
- ben
-
- -
- beng
- peng
- beng
- beng
- beng
-
- -
- bi
- pi
- bi
- bi
- bi
-
- -
- bian
- pien
- bian
- byan
- bian
-
- -
- biao
- piao
- biau
- byau
- biao
-
- -
- bie
- pieh
- bie
- bye
- bie
-
- -
- bin
- pin
- bin
- bin
- bin
-
- -
- bing
- ping
- bing
- bing
- bing
-
- -
- bo
- po
- bo
- bwo
- bo
-
- -
- bu
- pu
- bu
- bu
- bu
-
- -
- ca
- ts`a
- tsa
- tsa
- ca
-
- -
- cai
- ts`ai
- tsai
- tsai
- cai
-
- -
- can
- ts`an
- tsan
- tsan
- can
-
- -
- cang
- ts`ang
- tsang
- tsang
- cang
-
- -
- cao
- ts`ao
- tsau
- tsau
- cao
-
- -
- ce
- ts`e
- tse
- tse
- ce
-
- -
- cen
- ts`en
- tsen
- tsen
- cen
-
- -
- ceng
- ts`eng
- tseng
- tseng
- ceng
-
- -
- cha
- ch`a
- cha
- cha
- cha
-
- -
- chai
- ch`ai
- chai
- chai
- chai
-
- -
- chan
- ch`an
- chan
- chan
- chan
-
- -
- chang
- ch`ang
- chang
- chang
- chang
-
- -
- chao
- ch`ao
- chau
- chau
- chao
-
- -
- che
- ch`e
- che
- che
- che
-
- -
- chen
- ch`en
- chen
- chen
- chen
-
- -
- cheng
- ch`eng
- cheng
- cheng
- cheng
-
- -
- chi
- ch`ih
- chr
- chr
- chih
-
- -
- chong
- ch`ung
- chung
- chung
- chong
-
- -
- chou
- ch`ou
- chou
- chou
- chou
-
- -
- chu
- ch`u
- chu
- chu
- chu
-
- -
- chua
- ch`ua
- chua
- chwa
- chua
-
- -
- chuai
- ch`uai
- chuai
- chwai
- chuai
-
- -
- chuan
- ch`uan
- chuan
- chwan
- chuan
-
- -
- chuang
- ch`uang
- chuang
- chwang
- chuang
-
- -
- chui
- ch`ui
- chuei
- chwei
- chuei
-
- -
- chun
- ch`un
- chuen
- chwen
- chun
-
- -
- chuo
- ch`o
- chuo
- chwo
- chuo
-
- -
- qi
- ch`i
- chi
- chi
- ci
-
- -
- qia
- ch`ia
- chia
- chya
- cia
-
- -
- qian
- ch`ien
- chian
- chyan
- cian
-
- -
- qiang
- ch`iang
- chiang
- chyang
- ciang
-
- -
- qiao
- ch`iao
- chiau
- chyau
- ciao
-
- -
- qie
- ch`ieh
- chie
- chye
- cie
-
- -
- ci
- tz`u
- tsz
- tsz
- cih
-
- -
- qin
- ch`in
- chin
- chin
- cin
-
- -
- qing
- ch`ing
- ching
- ching
- cing
-
- -
- qiu
- ch`iu
- chiou
- chyou
- ciou
-
- -
- cong
- ts`ung
- tsung
- tsung
- cong
-
- -
- cou
- ts`ou
- tsou
- tsou
- cou
-
- -
- cu
- ts`u
- tsu
- tsu
- cu
-
- -
- cuan
- ts`uan
- tsuan
- tswan
- cuan
-
- -
- cui
- ts`ui
- tsuei
- tswei
- cuei
-
- -
- cun
- ts`un
- tsuen
- tswen
- cun
-
- -
- cuo
- ts`o
- tsuo
- tswo
- cuo
-
- -
- qiong
- ch`iung
- chiung
- chyung
- cyong
-
- -
- qu
- ch`u:
- chiu
- chyu
- cyu
-
- -
- quan
- ch`u:an
- chiuan
- chywan
- cyuan
-
- -
- que
- ch`u:eh
- chiue
- chywe
- cyue
-
- -
- qun
- ch`u:n
- chiun
- chyun
- cyun
-
- -
- da
- ta
- da
- da
- da
-
- -
- dai
- tai
- dai
- dai
- dai
-
- -
- dan
- tan
- dan
- dan
- dan
-
- -
- dang
- tang
- dang
- dang
- dang
-
- -
- dao
- tao
- dau
- dau
- dao
-
- -
- de
- te
- de
- de
- de
-
- -
- dei
- tei
- dei
- dei
- dei
-
- -
- den
- ten
- den
- den
- den
-
- -
- deng
- teng
- deng
- deng
- deng
-
- -
- di
- ti
- di
- di
- di
-
- -
- dian
- tien
- dian
- dyan
- dian
-
- -
- diang
- tiang
- diang
- dyang
- diang
-
- -
- diao
- tiao
- diau
- dyau
- diao
-
- -
- die
- tieh
- die
- dye
- die
-
- -
- ding
- ting
- ding
- ding
- ding
-
- -
- diu
- tiu
- diou
- dyou
- diou
-
- -
- dong
- tung
- dung
- dung
- dong
-
- -
- dou
- tou
- dou
- dou
- dou
-
- -
- du
- tu
- du
- du
- du
-
- -
- duan
- tuan
- duan
- dwan
- duan
-
- -
- dui
- tui
- duei
- dwei
- duei
-
- -
- dun
- tun
- duen
- dwen
- dun
-
- -
- duo
- to
- duo
- dwo
- duo
-
- -
- e
- e
- e
- e
- e
-
- -
- ei
- ei
- ei
- ei
- ei
-
- -
- en
- en
- en
- en
- en
-
- -
- er
- erh
- er
- er
- er
-
- -
- fa
- fa
- fa
- fa
- fa
-
- -
- fan
- fan
- fan
- fan
- fan
-
- -
- fang
- fang
- fang
- fang
- fang
-
- -
- fei
- fei
- fei
- fei
- fei
-
- -
- fen
- fen
- fen
- fen
- fen
-
- -
- fo
- fo
- fo
- fwo
- fo
-
- -
- feng
- feng
- feng
- feng
- fong
-
- -
- fou
- fou
- fou
- fou
- fou
-
- -
- fu
- fu
- fu
- fu
- fu
-
- -
- ga
- ka
- ga
- ga
- ga
-
- -
- gai
- kai
- gai
- gai
- gai
-
- -
- gan
- kan
- gan
- gan
- gan
-
- -
- gang
- kang
- gang
- gang
- gang
-
- -
- gao
- kao
- gau
- gau
- gao
-
- -
- ge
- ko
- ge
- ge
- ge
-
- -
- gei
- kei
- gei
- gei
- gei
-
- -
- gen
- ken
- gen
- gen
- gen
-
- -
- geng
- keng
- geng
- geng
- geng
-
- -
- gong
- kung
- gung
- gung
- gong
-
- -
- gou
- kou
- gou
- gou
- gou
-
- -
- gu
- ku
- gu
- gu
- gu
-
- -
- gua
- kua
- gua
- gwa
- gua
-
- -
- guai
- kuai
- guai
- gwai
- guai
-
- -
- guan
- kuan
- guan
- gwan
- guan
-
- -
- guang
- kuang
- guang
- gwang
- guang
-
- -
- gui
- kuei
- guei
- gwei
- guei
-
- -
- gun
- kun
- guen
- gwun
- gun
-
- -
- guo
- kuo
- guo
- gwo
- guo
-
- -
- ha
- ha
- ha
- ha
- ha
-
- -
- hai
- hai
- hai
- hai
- hai
-
- -
- han
- han
- han
- han
- han
-
- -
- hang
- hang
- hang
- hang
- hang
-
- -
- hao
- hao
- hau
- hau
- hao
-
- -
- he
- ho
- he
- he
- he
-
- -
- hei
- hei
- hei
- hei
- hei
-
- -
- hen
- hen
- hen
- hen
- hen
-
- -
- heng
- heng
- heng
- heng
- heng
-
- -
- hong
- hung
- hung
- hung
- hong
-
- -
- hou
- hou
- hou
- hou
- hou
-
- -
- hu
- hu
- hu
- hu
- hu
-
- -
- hua
- hua
- hua
- hwa
- hua
-
- -
- huai
- huai
- huai
- hwai
- huai
-
- -
- huan
- huan
- huan
- hwan
- huan
-
- -
- huang
- huang
- huang
- hwang
- huang
-
- -
- hui
- hui
- huei
- hwei
- huei
-
- -
- hun
- hun
- huen
- hwen
- hun
-
- -
- huo
- huo
- huo
- hwo
- huo
-
- -
- zha
- cha
- ja
- ja
- jha
-
- -
- zhai
- chai
- jai
- jai
- jhai
-
- -
- zhan
- chan
- jan
- jan
- jhan
-
- -
- zhang
- chang
- jang
- jang
- jhang
-
- -
- zhao
- chao
- jau
- jau
- jhao
-
- -
- zhe
- che
- je
- je
- jhe
-
- -
- zhei
- chei
- jei
- jei
- jhei
-
- -
- zhen
- chen
- jen
- jen
- jhen
-
- -
- zheng
- cheng
- jeng
- jeng
- jheng
-
- -
- zhi
- chih
- jr
- jr
- jhih
-
- -
- zhong
- chung
- jung
- jung
- jhong
-
- -
- zhou
- chou
- jou
- jou
- jhou
-
- -
- zhu
- chu
- ju
- ju
- jhu
-
- -
- zhua
- chua
- jua
- jwa
- jhua
-
- -
- zhuai
- chuai
- juai
- jwai
- jhuai
-
- -
- zhuan
- chuan
- juan
- jwan
- jhuan
-
- -
- zhuang
- chuang
- juang
- jwang
- jhuang
-
- -
- zhui
- chui
- juei
- jwei
- jhuei
-
- -
- zhun
- chun
- juen
- jwen
- jhun
-
- -
- zhuo
- cho
- juo
- jwo
- jhuo
-
- -
- ji
- chi
- ji
- ji
- ji
-
- -
- jia
- chia
- jia
- jya
- jia
-
- -
- jian
- chien
- jian
- jyan
- jian
-
- -
- jiang
- chiang
- jiang
- jyang
- jiang
-
- -
- jiao
- chiao
- jiau
- jyau
- jiao
-
- -
- jie
- chieh
- jie
- jye
- jie
-
- -
- jin
- chin
- jin
- jin
- jin
-
- -
- jing
- ching
- jing
- jing
- jing
-
- -
- jiu
- chiu
- jiou
- jyou
- jiou
-
- -
- jiong
- chiung
- jiung
- jyung
- jyong
-
- -
- ju
- chu:
- jiu
- jyu
- jyu
-
- -
- juan
- chu:an
- jiuan
- jywan
- jyuan
-
- -
- jue
- chu:eh
- jiue
- jywe
- jyue
-
- -
- jun
- chu:n
- jiun
- jyun
- jyun
-
- -
- ka
- k`a
- ka
- ka
- ka
-
- -
- kai
- k`ai
- kai
- kai
- kai
-
- -
- kan
- k`an
- kan
- kan
- kan
-
- -
- kang
- k`ang
- kang
- kang
- kang
-
- -
- kao
- k`ao
- kau
- kau
- kao
-
- -
- ke
- k`o
- ke
- ke
- ke
-
- -
- ken
- k`en
- ken
- ken
- ken
-
- -
- keng
- k`eng
- keng
- keng
- keng
-
- -
- kong
- k`ung
- kung
- kung
- kong
-
- -
- kou
- k`ou
- kou
- kou
- kou
-
- -
- ku
- k`u
- ku
- ku
- ku
-
- -
- kua
- k`ua
- kua
- kwa
- kua
-
- -
- kuai
- k`uai
- kuai
- kwai
- kuai
-
- -
- kuan
- k`uan
- kuan
- kwan
- kuan
-
- -
- kuang
- k`uang
- kuang
- kwang
- kuang
-
- -
- kui
- k`uei
- kuei
- kwei
- kuei
-
- -
- kun
- k`un
- kuen
- kwen
- kun
-
- -
- kuo
- k`uo
- kuo
- kwo
- kuo
-
- -
- la
- la
- la
- la
- la
-
- -
- lai
- lai
- lai
- lai
- lai
-
- -
- lan
- lan
- lan
- lan
- lan
-
- -
- lang
- lang
- lang
- lang
- lang
-
- -
- lao
- lao
- lau
- lau
- lao
-
- -
- le
- le
- le
- le
- le
-
- -
- lei
- lei
- lei
- lei
- lei
-
- -
- leng
- leng
- leng
- leng
- leng
-
- -
- li
- li
- li
- li
- li
-
- -
- lia
- lia
- lia
- lya
- lia
-
- -
- lian
- lien
- lian
- lyan
- lian
-
- -
- liang
- liang
- liang
- lyang
- liang
-
- -
- liao
- liao
- liau
- lyau
- liao
-
- -
- lie
- lieh
- lie
- lye
- lie
-
- -
- lin
- lin
- lin
- lin
- lin
-
- -
- ling
- ling
- ling
- ling
- ling
-
- -
- liu
- liu
- liou
- lyou
- liou
-
- -
- lo
- lo
- lo
- lo
- lo
-
- -
- long
- lung
- lung
- lung
- long
-
- -
- lou
- lou
- lou
- lou
- lou
-
- -
- lu
- lu
- lu
- lu
- lu
-
- -
- luan
- luan
- luan
- lwan
- luan
-
- -
- lun
- lun
- luen
- lwun
- lun
-
- -
- luo
- lo
- luo
- lwo
- luo
-
- -
- lu:
- lu:
- liu
- lyu
- lyu
-
- -
- lu:e
- lu:eh
- liue
- lywe
- lyue
-
- -
- lu:n
- lu:n
- liun
- lyun
- lyun
-
- -
- ma
- ma
- ma
- ma
- ma
-
- -
- mai
- mai
- mai
- mai
- mai
-
- -
- man
- man
- man
- man
- man
-
- -
- mang
- mang
- mang
- mang
- mang
-
- -
- mao
- mao
- mau
- mau
- mao
-
- -
- me
- me
- me
- me
- me
-
- -
- mei
- mei
- mei
- mei
- mei
-
- -
- men
- men
- men
- men
- men
-
- -
- meng
- meng
- meng
- meng
- meng
-
- -
- mi
- mi
- mi
- mi
- mi
-
- -
- mian
- mien
- mian
- myan
- mian
-
- -
- miao
- miao
- miau
- myau
- miao
-
- -
- mie
- mieh
- mie
- mye
- mie
-
- -
- min
- min
- min
- min
- min
-
- -
- ming
- ming
- ming
- ming
- ming
-
- -
- miu
- miu
- miou
- myou
- miou
-
- -
- mo
- mo
- mo
- mwo
- mo
-
- -
- mou
- mou
- mou
- mou
- mou
-
- -
- mu
- mu
- mu
- mu
- mu
-
- -
- na
- na
- na
- na
- na
-
- -
- nai
- nai
- nai
- nai
- nai
-
- -
- nan
- nan
- nan
- nan
- nan
-
- -
- nang
- nang
- nang
- nang
- nang
-
- -
- nao
- nao
- nau
- nau
- nao
-
- -
- ne
- ne
- ne
- ne
- ne
-
- -
- nei
- nei
- nei
- nei
- nei
-
- -
- nen
- nen
- nen
- nen
- nen
-
- -
- neng
- neng
- neng
- neng
- neng
-
- -
- ni
- ni
- ni
- ni
- ni
-
- -
- nia
- nia
- nia
- nya
- nia
-
- -
- nian
- nien
- nian
- nyan
- nian
-
- -
- niang
- niang
- niang
- nyang
- niang
-
- -
- niao
- niao
- niau
- nyau
- niao
-
- -
- nie
- nieh
- nie
- nye
- nie
-
- -
- nin
- nin
- nin
- nin
- nin
-
- -
- ning
- ning
- ning
- ning
- ning
-
- -
- niu
- niu
- niou
- nyou
- niou
-
- -
- nong
- nung
- nung
- nung
- nong
-
- -
- nou
- nou
- nou
- nou
- nou
-
- -
- nu
- nu
- nu
- nu
- nu
-
- -
- nuan
- nuan
- nuan
- nwan
- nuan
-
- -
- nun
- nun
- nuen
- nwen
- nun
-
- -
- nuo
- no
- nuo
- nwo
- nuo
-
- -
- nu:
- nu:
- niu
- nyu
- nyu
-
- -
- nu:e
- nu:eh
- niue
- nywe
- nyue
-
- -
- ou
- ou
- ou
- ou
- ou
-
- -
- pa
- p`a
- pa
- pa
- pa
-
- -
- pai
- p`ai
- pai
- pai
- pai
-
- -
- pan
- p`an
- pan
- pan
- pan
-
- -
- pang
- p`ang
- pang
- pang
- pang
-
- -
- pao
- p`ao
- pau
- pau
- pao
-
- -
- pei
- p`ei
- pei
- pei
- pei
-
- -
- pen
- p`en
- pen
- pen
- pen
-
- -
- peng
- p`eng
- peng
- peng
- peng
-
- -
- pi
- p`i
- pi
- pi
- pi
-
- -
- pian
- p`ien
- pian
- pyan
- pian
-
- -
- piao
- p`iao
- piau
- pyau
- piao
-
- -
- pie
- p`ieh
- pie
- pye
- pie
-
- -
- pin
- p`in
- pin
- pin
- pin
-
- -
- ping
- p`ing
- ping
- ping
- ping
-
- -
- po
- p`o
- po
- pwo
- po
-
- -
- pou
- p`ou
- pou
- pou
- pou
-
- -
- pu
- p`u
- pu
- pu
- pu
-
- -
- ran
- jan
- ran
- ran
- ran
-
- -
- rang
- jang
- rang
- rang
- rang
-
- -
- rao
- jao
- rau
- rau
- rao
-
- -
- re
- je
- re
- re
- re
-
- -
- ren
- jen
- ren
- ren
- ren
-
- -
- reng
- jeng
- reng
- reng
- reng
-
- -
- ri
- jih
- r
- r
- rih
-
- -
- rong
- jung
- rung
- rung
- rong
-
- -
- rou
- jou
- rou
- rou
- rou
-
- -
- ru
- ju
- ru
- ru
- ru
-
- -
- ruan
- juan
- ruan
- rwan
- ruan
-
- -
- rui
- jui
- ruei
- rwei
- ruei
-
- -
- run
- jun
- ruen
- rwun
- run
-
- -
- ruo
- jo
- ruo
- rwo
- ruo
-
- -
- sa
- sa
- sa
- sa
- sa
-
- -
- sai
- sai
- sai
- sai
- sai
-
- -
- san
- san
- san
- san
- san
-
- -
- sang
- sang
- sang
- sang
- sang
-
- -
- sao
- sao
- sau
- sau
- sao
-
- -
- se
- se
- se
- se
- se
-
- -
- sei
- sei
- sei
- sei
- sei
-
- -
- sen
- sen
- sen
- sen
- sen
-
- -
- seng
- seng
- seng
- seng
- seng
-
- -
- sha
- sha
- sha
- sha
- sha
-
- -
- shai
- shai
- shai
- shai
- shai
-
- -
- shan
- shan
- shan
- shan
- shan
-
- -
- shang
- shang
- shang
- shang
- shang
-
- -
- shao
- shao
- shau
- shau
- shao
-
- -
- she
- she
- she
- she
- she
-
- -
- shei
- shei
- shei
- shei
- shei
-
- -
- shen
- shen
- shen
- shen
- shen
-
- -
- sheng
- sheng
- sheng
- sheng
- sheng
-
- -
- shi
- shih
- shr
- shr
- shih
-
- -
- shong
- shung
- shung
- shung
- shong
-
- -
- shou
- shou
- shou
- shou
- shou
-
- -
- shu
- shu
- shu
- shu
- shu
-
- -
- shua
- shua
- shua
- shwa
- shua
-
- -
- shuai
- shuai
- shuai
- shwai
- shuai
-
- -
- shuan
- shuan
- shuan
- shwan
- shuan
-
- -
- shuang
- shuang
- shuang
- shwang
- shuang
-
- -
- shui
- shui
- shuei
- shwei
- shuei
-
- -
- shun
- shun
- shuen
- shwun
- shun
-
- -
- shuo
- shuo
- shuo
- shwo
- shuo
-
- -
- xi
- hsi
- shi
- syi
- si
-
- -
- xia
- hsia
- shia
- sya
- sia
-
- -
- xian
- hsien
- shian
- syan
- sian
-
- -
- xiang
- hsiang
- shiang
- syang
- siang
-
- -
- xiao
- hsiao
- shiau
- syau
- siao
-
- -
- xie
- hsieh
- shie
- sye
- sie
-
- -
- si
- ssu
- sz
- sz
- sih
-
- -
- xin
- hsin
- shin
- syin
- sin
-
- -
- xing
- hsing
- shing
- sying
- sing
-
- -
- xiu
- hsiu
- shiou
- syou
- siou
-
- -
- song
- sung
- sung
- sung
- song
-
- -
- sou
- sou
- sou
- sou
- sou
-
- -
- su
- su
- su
- su
- su
-
- -
- suan
- suan
- suan
- swan
- suan
-
- -
- sui
- sui
- suei
- swei
- suei
-
- -
- sun
- sun
- suen
- swen
- sun
-
- -
- suo
- so
- suo
- swo
- suo
-
- -
- xiong
- hsiung
- shiung
- syung
- syong
-
- -
- xu
- hsu:
- shiu
- syu
- syu
-
- -
- xuan
- hsu:an
- shiuan
- sywan
- syuan
-
- -
- xue
- hsu:eh
- shiue
- sywe
- syue
-
- -
- xun
- hsu:n
- shiun
- syun
- syun
-
- -
- ta
- t`a
- ta
- ta
- ta
-
- -
- tai
- t`ai
- tai
- tai
- tai
-
- -
- tan
- t`an
- tan
- tan
- tan
-
- -
- tang
- t`ang
- tang
- tang
- tang
-
- -
- tao
- t`ao
- tau
- tau
- tao
-
- -
- te
- t`e
- te
- te
- te
-
- -
- teng
- t`eng
- teng
- teng
- teng
-
- -
- ti
- t`i
- ti
- ti
- ti
-
- -
- tian
- t`ien
- tian
- tyan
- tian
-
- -
- tiao
- t`iao
- tiau
- tyau
- tiao
-
- -
- tie
- t`ieh
- tie
- tye
- tie
-
- -
- ting
- t`ing
- ting
- ting
- ting
-
- -
- tong
- t`ung
- tung
- tung
- tong
-
- -
- tou
- t`ou
- tou
- tou
- tou
-
- -
- tu
- t`u
- tu
- tu
- tu
-
- -
- tuan
- t`uan
- tuan
- twan
- tuan
-
- -
- tui
- t`ui
- tuei
- twei
- tuei
-
- -
- tun
- t`un
- tuen
- twen
- tun
-
- -
- tuo
- t`o
- tuo
- two
- tuo
-
- -
- wa
- wa
- wa
- wa
- wa
-
- -
- wai
- wai
- wai
- wai
- wai
-
- -
- wan
- wan
- wan
- wan
- wan
-
- -
- wang
- wang
- wang
- wang
- wang
-
- -
- wei
- wei
- wei
- wei
- wei
-
- -
- wo
- wo
- wo
- wo
- wo
-
- -
- weng
- weng
- weng
- weng
- wong
-
- -
- wu
- wu
- wu
- wu
- wu
-
- -
- wen
- wen
- wen
- wen
- wun
-
- -
- ya
- ya
- ya
- ya
- ya
-
- -
- yan
- yan
- yan
- yan
- yan
-
- -
- yang
- yang
- yang
- yang
- yang
-
- -
- yao
- yao
- yau
- yau
- yao
-
- -
- ye
- yeh
- ye
- ye
- ye
-
- -
- yi
- i
- yi
- yi
- yi
-
- -
- yin
- yin
- yin
- yin
- yin
-
- -
- ying
- ying
- ying
- ying
- ying
-
- -
- yong
- yung
- yung
- yung
- yong
-
- -
- you
- yu
- you
- you
- you
-
- -
- yu
- yu:
- yu
- yu
- yu
-
- -
- yuan
- yu:an
- yuan
- ywan
- yuan
-
- -
- yue
- yu:eh
- yue
- ywe
- yue
-
- -
- yun
- yu:n
- yun
- yun
- yun
-
- -
- za
- tsa
- tza
- dza
- za
-
- -
- zai
- tsai
- tzai
- dzai
- zai
-
- -
- zan
- tsan
- tzan
- dzan
- zan
-
- -
- zang
- tsang
- tzang
- dzang
- zang
-
- -
- zao
- tsao
- tzau
- dzau
- zao
-
- -
- ze
- tse
- tze
- dze
- ze
-
- -
- zei
- tsei
- tzei
- dzei
- zei
-
- -
- zen
- tsen
- tzen
- dzen
- zen
-
- -
- zeng
- tseng
- tzeng
- dzeng
- zeng
-
- -
- zi
- tzu
- tz
- dz
- zih
-
- -
- zong
- tsung
- tzung
- dzung
- zong
-
- -
- zou
- tsou
- tzou
- dzou
- zou
-
- -
- zu
- tsu
- tzu
- dzu
- zu
-
- -
- zuan
- tsuan
- tzuan
- dzwan
- zuan
-
- -
- zui
- tsui
- tzuei
- dzwei
- zuei
-
- -
- zun
- tsun
- tzuen
- dzwen
- zun
-
- -
- zuo
- tso
- tzuo
- dzwo
- zuo
-
-
diff --git a/Flow.Launcher.Infrastructure/pinyindb/unicode_to_hanyu_pinyin.txt b/Flow.Launcher.Infrastructure/pinyindb/unicode_to_hanyu_pinyin.txt
deleted file mode 100644
index 8cb1c9cc7..000000000
--- a/Flow.Launcher.Infrastructure/pinyindb/unicode_to_hanyu_pinyin.txt
+++ /dev/null
@@ -1,20903 +0,0 @@
-3007 (ling2)
-4E00 (yi1)
-4E01 (ding1,zheng1)
-4E02 (kao3)
-4E03 (qi1)
-4E04 (shang4,shang3)
-4E05 (xia4)
-4E06 (none0)
-4E07 (wan4,mo4)
-4E08 (zhang4)
-4E09 (san1)
-4E0A (shang4,shang3)
-4E0B (xia4)
-4E0C (ji1)
-4E0D (bu4,bu2,fou3)
-4E0E (yu3,yu4,yu2)
-4E0F (mian3)
-4E10 (gai4)
-4E11 (chou3)
-4E12 (chou3)
-4E13 (zhuan1)
-4E14 (qie3,ju1)
-4E15 (pi1)
-4E16 (shi4)
-4E17 (shi4)
-4E18 (qiu1)
-4E19 (bing3)
-4E1A (ye4)
-4E1B (cong2)
-4E1C (dong1)
-4E1D (si1)
-4E1E (cheng2)
-4E1F (diu1)
-4E20 (qiu1)
-4E21 (liang3)
-4E22 (diu1)
-4E23 (you3)
-4E24 (liang3)
-4E25 (yan2)
-4E26 (bing4)
-4E27 (sang1,sang4,sang5)
-4E28 (shu4)
-4E29 (jiu1)
-4E2A (ge4,ge3)
-4E2B (ya1)
-4E2C (qiang2,pan2)
-4E2D (zhong1,zhong4)
-4E2E (ji3)
-4E2F (jie4)
-4E30 (feng1)
-4E31 (guan4)
-4E32 (chuan4)
-4E33 (chan3)
-4E34 (lin2)
-4E35 (zhuo1)
-4E36 (zhu3,dian3)
-4E37 (none0)
-4E38 (wan2)
-4E39 (dan1)
-4E3A (wei2,wei4)
-4E3B (zhu3)
-4E3C (jing3,dan3)
-4E3D (li4,li2)
-4E3E (ju3)
-4E3F (pie3)
-4E40 (fu2)
-4E41 (yi2)
-4E42 (yi4,ai4)
-4E43 (nai3)
-4E44 (none0)
-4E45 (jiu3)
-4E46 (jiu3)
-4E47 (tuo1)
-4E48 (me5,ma5,yao1)
-4E49 (yi4)
-4E4A (none0)
-4E4B (zhi1)
-4E4C (wu1,wu4)
-4E4D (zha4)
-4E4E (hu1)
-4E4F (fa2)
-4E50 (le4,yue4)
-4E51 (zhong4)
-4E52 (ping1)
-4E53 (pang1)
-4E54 (qiao2)
-4E55 (hu3,hu4)
-4E56 (guai1)
-4E57 (cheng2,sheng4)
-4E58 (cheng2,sheng4)
-4E59 (yi3)
-4E5A (yin3)
-4E5B (none0)
-4E5C (mie1,nie4)
-4E5D (jiu3)
-4E5E (qi3)
-4E5F (ye3)
-4E60 (xi2)
-4E61 (xiang1)
-4E62 (gai4)
-4E63 (diu1)
-4E64 (none0)
-4E65 (none0)
-4E66 (shu1)
-4E67 (none0)
-4E68 (shi3)
-4E69 (ji1)
-4E6A (nang1)
-4E6B (jia1)
-4E6C (none0)
-4E6D (shi2)
-4E6E (none0)
-4E6F (none0)
-4E70 (mai3)
-4E71 (luan4)
-4E72 (none0)
-4E73 (ru3)
-4E74 (xi3)
-4E75 (yan3)
-4E76 (fu3)
-4E77 (sha1)
-4E78 (na3)
-4E79 (gan1,qian2)
-4E7A (none0)
-4E7B (none0)
-4E7C (none0)
-4E7D (none0)
-4E7E (qian2,gan1)
-4E7F (zhi4)
-4E80 (gui1,jun1,qiu1)
-4E81 (gan1)
-4E82 (luan4)
-4E83 (lin3)
-4E84 (yi4)
-4E85 (jue2)
-4E86 (le5,liao3,liao4)
-4E87 (none0)
-4E88 (yu3,yu2)
-4E89 (zheng1)
-4E8A (shi4)
-4E8B (shi4)
-4E8C (er4)
-4E8D (chu4)
-4E8E (yu2)
-4E8F (kui1)
-4E90 (yu2)
-4E91 (yun2)
-4E92 (hu4)
-4E93 (qi2)
-4E94 (wu3)
-4E95 (jing3)
-4E96 (si4)
-4E97 (sui4)
-4E98 (gen4)
-4E99 (gen4,geng4)
-4E9A (ya4)
-4E9B (xie1,xie5)
-4E9C (ya4)
-4E9D (qi2)
-4E9E (ya4,ya3)
-4E9F (ji2,qi4)
-4EA0 (tou2)
-4EA1 (wang2,wu2)
-4EA2 (kang4)
-4EA3 (ta4)
-4EA4 (jiao1)
-4EA5 (hai4)
-4EA6 (yi4)
-4EA7 (chan3)
-4EA8 (heng1)
-4EA9 (mu3)
-4EAA (none0)
-4EAB (xiang3)
-4EAC (jing1)
-4EAD (ting2)
-4EAE (liang4)
-4EAF (heng1)
-4EB0 (jing1)
-4EB1 (ye4)
-4EB2 (qin1,qin5,qing4)
-4EB3 (bo2)
-4EB4 (you4)
-4EB5 (xie4)
-4EB6 (dan3,dan4)
-4EB7 (lian2)
-4EB8 (duo3)
-4EB9 (wei3,wei4)
-4EBA (ren2)
-4EBB (ren2)
-4EBC (ji2)
-4EBD (none0)
-4EBE (wang2)
-4EBF (yi4)
-4EC0 (shen2,shi2,she2)
-4EC1 (ren2)
-4EC2 (le4)
-4EC3 (ding1)
-4EC4 (ze4)
-4EC5 (jin3,jin4)
-4EC6 (pu1,pu2)
-4EC7 (chou2,qiu2)
-4EC8 (ba1)
-4EC9 (zhang3)
-4ECA (jin1)
-4ECB (jie4)
-4ECC (bing1)
-4ECD (reng2)
-4ECE (cong2,cong1)
-4ECF (fo2,fu2)
-4ED0 (san3)
-4ED1 (lun2)
-4ED2 (none0)
-4ED3 (cang1)
-4ED4 (zi3,zai3,zi1)
-4ED5 (shi4)
-4ED6 (ta1)
-4ED7 (zhang4)
-4ED8 (fu4)
-4ED9 (xian1)
-4EDA (xian1)
-4EDB (cha4)
-4EDC (hong2)
-4EDD (tong2)
-4EDE (ren4)
-4EDF (qian1)
-4EE0 (gan3)
-4EE1 (ge1,yi4)
-4EE2 (di2)
-4EE3 (dai4)
-4EE4 (ling4,ling2,ling3)
-4EE5 (yi3)
-4EE6 (chao4)
-4EE7 (chang2)
-4EE8 (sa1)
-4EE9 (shang4)
-4EEA (yi2)
-4EEB (mu4)
-4EEC (men5,men2)
-4EED (ren4)
-4EEE (jia3,jia4)
-4EEF (chao4)
-4EF0 (yang3)
-4EF1 (qian2)
-4EF2 (zhong4)
-4EF3 (pi3)
-4EF4 (wan4)
-4EF5 (wu3)
-4EF6 (jian4)
-4EF7 (jia4,jie4,jie5)
-4EF8 (yao3)
-4EF9 (feng1)
-4EFA (cang1)
-4EFB (ren4,ren2)
-4EFC (wang2)
-4EFD (fen4)
-4EFE (di1)
-4EFF (fang3)
-4F00 (zhong1)
-4F01 (qi3,qi4)
-4F02 (pei4)
-4F03 (yu2)
-4F04 (diao4)
-4F05 (dun4)
-4F06 (wen4)
-4F07 (yi4)
-4F08 (xin3)
-4F09 (kang4)
-4F0A (yi1)
-4F0B (ji2)
-4F0C (ai4)
-4F0D (wu3)
-4F0E (ji4)
-4F0F (fu2)
-4F10 (fa2,fa1)
-4F11 (xiu1)
-4F12 (jin4)
-4F13 (bei1)
-4F14 (chen2)
-4F15 (fu1)
-4F16 (tang3)
-4F17 (zhong4)
-4F18 (you1)
-4F19 (huo3)
-4F1A (hui4,kuai4)
-4F1B (yu3)
-4F1C (cui4,zu2)
-4F1D (yun2)
-4F1E (san3)
-4F1F (wei3)
-4F20 (chuan2,zhuan4)
-4F21 (che1)
-4F22 (ya2)
-4F23 (xian4)
-4F24 (shang1)
-4F25 (chang1,tang3)
-4F26 (lun2)
-4F27 (cang1,chen5)
-4F28 (xun4)
-4F29 (xin4)
-4F2A (wei3)
-4F2B (zhu4)
-4F2C (chi3)
-4F2D (xuan2)
-4F2E (nao2,nu3)
-4F2F (bo2,bai3,ba4)
-4F30 (gu1,gu4)
-4F31 (ni3)
-4F32 (ni4)
-4F33 (xie4)
-4F34 (ban4)
-4F35 (xu4)
-4F36 (ling2)
-4F37 (zhou4)
-4F38 (shen1)
-4F39 (qu1)
-4F3A (si4,ci4)
-4F3B (beng1)
-4F3C (si4,shi4)
-4F3D (jia1,ga1,qie2,qia1)
-4F3E (pi1)
-4F3F (yi4)
-4F40 (si4,shi4)
-4F41 (ai3)
-4F42 (zheng1,zheng4)
-4F43 (dian4,tian2)
-4F44 (han2)
-4F45 (mai4)
-4F46 (dan4)
-4F47 (zhu4)
-4F48 (bu4)
-4F49 (qu1)
-4F4A (bi3)
-4F4B (shao4)
-4F4C (ci3)
-4F4D (wei4)
-4F4E (di1)
-4F4F (zhu4)
-4F50 (zuo3)
-4F51 (you4)
-4F52 (yang1)
-4F53 (ti3,ben4,ti1)
-4F54 (zhan4)
-4F55 (he2,he4)
-4F56 (bi4)
-4F57 (tuo2)
-4F58 (she2)
-4F59 (yu2,tu2)
-4F5A (yi4,die2)
-4F5B (fo2,fu2)
-4F5C (zuo4,zuo1,zuo2)
-4F5D (gou1)
-4F5E (ning4)
-4F5F (tong2)
-4F60 (ni3)
-4F61 (xuan1,san3)
-4F62 (ju4)
-4F63 (yong1,yong4)
-4F64 (wa3)
-4F65 (qian1)
-4F66 (none0)
-4F67 (ka3)
-4F68 (none0)
-4F69 (pei4)
-4F6A (huai2)
-4F6B (he4)
-4F6C (lao3)
-4F6D (xiang2)
-4F6E (ge2)
-4F6F (yang2)
-4F70 (bai3)
-4F71 (fa3)
-4F72 (ming2)
-4F73 (jia1)
-4F74 (nai4,er4)
-4F75 (bing4)
-4F76 (ji2)
-4F77 (heng2)
-4F78 (huo2)
-4F79 (gui3)
-4F7A (quan2)
-4F7B (tiao1,tiao2)
-4F7C (jiao3,jia3)
-4F7D (ci4)
-4F7E (yi4)
-4F7F (shi3,shi4)
-4F80 (xing2)
-4F81 (shen1)
-4F82 (tuo1)
-4F83 (kan3)
-4F84 (zhi2)
-4F85 (gai1,kai1)
-4F86 (lai2)
-4F87 (yi2)
-4F88 (chi3)
-4F89 (kua3)
-4F8A (guang1)
-4F8B (li4)
-4F8C (yin1)
-4F8D (shi4)
-4F8E (mi3)
-4F8F (zhu1)
-4F90 (xu4)
-4F91 (you4)
-4F92 (an1)
-4F93 (lu4)
-4F94 (mou2)
-4F95 (er2)
-4F96 (lun2)
-4F97 (dong4,tong2,tong3)
-4F98 (cha4)
-4F99 (chi4)
-4F9A (xun4)
-4F9B (gong1,gong4)
-4F9C (zhou1)
-4F9D (yi1)
-4F9E (ru3)
-4F9F (jian4)
-4FA0 (xia2)
-4FA1 (jia4,jie4)
-4FA2 (zai4)
-4FA3 (lu:3)
-4FA4 (none0)
-4FA5 (jiao3,yao2,jia3)
-4FA6 (zhen1)
-4FA7 (ce4,ze4,zhai1)
-4FA8 (qiao2)
-4FA9 (kuai4)
-4FAA (chai2)
-4FAB (ning4)
-4FAC (nong2)
-4FAD (jin3,jin4)
-4FAE (wu3)
-4FAF (hou4,hou2)
-4FB0 (jiong3)
-4FB1 (cheng3)
-4FB2 (zhen4)
-4FB3 (cuo4)
-4FB4 (chou3)
-4FB5 (qin1)
-4FB6 (lu:3)
-4FB7 (ju2)
-4FB8 (shu4)
-4FB9 (ting3)
-4FBA (shen4)
-4FBB (tuo1)
-4FBC (bo2)
-4FBD (nan2)
-4FBE (hao1)
-4FBF (bian4,pian2)
-4FC0 (tui3)
-4FC1 (yu3)
-4FC2 (xi4)
-4FC3 (cu4)
-4FC4 (e2,e4)
-4FC5 (qiu2)
-4FC6 (xu2)
-4FC7 (kuang3)
-4FC8 (ku4)
-4FC9 (wu2)
-4FCA (jun4,zun4,juan4)
-4FCB (yi4)
-4FCC (fu3)
-4FCD (lang2)
-4FCE (zu3)
-4FCF (qiao4)
-4FD0 (li4)
-4FD1 (yong3)
-4FD2 (hun4)
-4FD3 (jing4)
-4FD4 (xian4)
-4FD5 (san4)
-4FD6 (pai3)
-4FD7 (su2)
-4FD8 (fu2)
-4FD9 (xi1)
-4FDA (li3)
-4FDB (mian3)
-4FDC (ping1)
-4FDD (bao3)
-4FDE (yu2,shu4)
-4FDF (si4,qi2)
-4FE0 (xia2)
-4FE1 (xin4,shen1)
-4FE2 (xiu1)
-4FE3 (yu3)
-4FE4 (ti4)
-4FE5 (che1)
-4FE6 (chou2)
-4FE7 (none0)
-4FE8 (yan3)
-4FE9 (liang3,lia3)
-4FEA (li4)
-4FEB (lai2)
-4FEC (si1)
-4FED (jian3)
-4FEE (xiu1)
-4FEF (fu3)
-4FF0 (he2)
-4FF1 (ju4,ju1)
-4FF2 (xiao4)
-4FF3 (pai2)
-4FF4 (jian4)
-4FF5 (biao4,biao3)
-4FF6 (ti4,chu4)
-4FF7 (fei4)
-4FF8 (feng4)
-4FF9 (ya4)
-4FFA (an3)
-4FFB (bei4)
-4FFC (yu4,zhou1)
-4FFD (xin1)
-4FFE (bi3,bei1,bi4)
-4FFF (chi2)
-5000 (chang1)
-5001 (zhi1)
-5002 (bing4)
-5003 (zan2)
-5004 (yao2)
-5005 (cui4)
-5006 (lia3,liang3)
-5007 (wan3)
-5008 (lai2)
-5009 (cang1)
-500A (zong3)
-500B (ge4,ge5)
-500C (guan1)
-500D (bei4)
-500E (tian1)
-500F (shu1,shu4)
-5010 (shu1)
-5011 (men5,men2)
-5012 (dao3,dao4)
-5013 (tan2)
-5014 (jue2,jue4)
-5015 (chui2)
-5016 (xing4)
-5017 (peng2)
-5018 (tang3,chang2)
-5019 (hou4)
-501A (yi3)
-501B (qi1)
-501C (ti4)
-501D (gan4)
-501E (jing4,liang4)
-501F (jie4)
-5020 (xu1)
-5021 (chang4,chang1)
-5022 (jie2)
-5023 (fang3)
-5024 (zhi2)
-5025 (kong1,kong3)
-5026 (juan4)
-5027 (zong1)
-5028 (ju4)
-5029 (qian4)
-502A (ni2)
-502B (lun2)
-502C (zhuo1,zhuo2)
-502D (wo1)
-502E (luo3)
-502F (song1)
-5030 (leng2)
-5031 (hun4)
-5032 (dong1)
-5033 (zi4)
-5034 (ben4)
-5035 (wu3)
-5036 (ju4,ju1)
-5037 (nai4)
-5038 (cai3)
-5039 (jian3)
-503A (zhai4)
-503B (ye1)
-503C (zhi2)
-503D (sha4)
-503E (qing1)
-503F (none0)
-5040 (ying1)
-5041 (cheng1,cheng4)
-5042 (qian2)
-5043 (yan3)
-5044 (nuan4)
-5045 (zhong4)
-5046 (chun3)
-5047 (jia3,jia4)
-5048 (jie2,ji4)
-5049 (wei3)
-504A (yu3)
-504B (bing4)
-504C (ruo4)
-504D (ti2)
-504E (wei1)
-504F (pian1)
-5050 (yan4)
-5051 (feng1)
-5052 (tang3)
-5053 (wo4)
-5054 (e4)
-5055 (xie2,jie1)
-5056 (che3)
-5057 (sheng3)
-5058 (kan3)
-5059 (di4)
-505A (zuo4)
-505B (cha1)
-505C (ting2)
-505D (bei1)
-505E (ye4)
-505F (huang2)
-5060 (yao3)
-5061 (zhan4)
-5062 (qiu1)
-5063 (yan1)
-5064 (you2)
-5065 (jian4)
-5066 (xu3)
-5067 (zha1)
-5068 (chai1)
-5069 (fu4)
-506A (bi1)
-506B (zhi4)
-506C (zong3)
-506D (mian3)
-506E (ji2)
-506F (yi3)
-5070 (xie4)
-5071 (xun2)
-5072 (si1,cai1)
-5073 (duan1)
-5074 (ce4,ze4)
-5075 (zhen1)
-5076 (ou3)
-5077 (tou1)
-5078 (tou1)
-5079 (bei4)
-507A (za2,zan2)
-507B (lou2,lu:3)
-507C (jie2)
-507D (wei4)
-507E (fen4)
-507F (chang2)
-5080 (kui3,gui1)
-5081 (sou3)
-5082 (chi3)
-5083 (su4)
-5084 (xia1)
-5085 (fu4)
-5086 (yuan4)
-5087 (rong3)
-5088 (li4)
-5089 (ru4)
-508A (yun3)
-508B (gou4)
-508C (ma4)
-508D (bang4,bang1)
-508E (dian1)
-508F (tang2)
-5090 (hao1)
-5091 (jie2)
-5092 (xi1)
-5093 (shan1)
-5094 (qian4)
-5095 (jue2)
-5096 (cang1)
-5097 (chu4)
-5098 (san3)
-5099 (bei4)
-509A (xiao4)
-509B (yong2)
-509C (yao2)
-509D (ta4)
-509E (suo1)
-509F (wang1)
-50A0 (fa2)
-50A1 (bing4,bing1)
-50A2 (jia1)
-50A3 (dai3)
-50A4 (zai4)
-50A5 (tang3)
-50A6 (none0)
-50A7 (bin1)
-50A8 (chu3)
-50A9 (nuo2)
-50AA (zan1)
-50AB (lei3)
-50AC (cui1)
-50AD (yong1,yong4,yong2)
-50AE (zao1)
-50AF (zong3)
-50B0 (peng2)
-50B1 (song3)
-50B2 (ao4)
-50B3 (chuan2,zhuan4)
-50B4 (yu3)
-50B5 (zhai4)
-50B6 (zu2)
-50B7 (shang1)
-50B8 (qiang3)
-50B9 (qiang1)
-50BA (chi4)
-50BB (sha3)
-50BC (han4)
-50BD (zhang1)
-50BE (qing1,qing2)
-50BF (yan4)
-50C0 (di4)
-50C1 (xi1)
-50C2 (lou2,lu:3)
-50C3 (bei4)
-50C4 (piao1)
-50C5 (jin3,jin4)
-50C6 (lian3)
-50C7 (lu4)
-50C8 (man4)
-50C9 (qian1)
-50CA (xian1)
-50CB (qiu2)
-50CC (ying2)
-50CD (dong4)
-50CE (zhuan4)
-50CF (xiang4)
-50D0 (shan3)
-50D1 (qiao2)
-50D2 (jiong3)
-50D3 (tui2)
-50D4 (zun3)
-50D5 (pu2,pu1)
-50D6 (xi1)
-50D7 (lao4)
-50D8 (chang3)
-50D9 (guang1)
-50DA (liao2)
-50DB (qi1)
-50DC (deng4)
-50DD (chan2)
-50DE (wei3)
-50DF (zhang3)
-50E0 (fan1)
-50E1 (hui4)
-50E2 (chuan3)
-50E3 (tie3)
-50E4 (dan4)
-50E5 (jiao3,yao2)
-50E6 (jiu4)
-50E7 (seng1)
-50E8 (fen4)
-50E9 (xian4)
-50EA (jue2)
-50EB (e4)
-50EC (jiao1)
-50ED (jian4)
-50EE (tong2,zhuang4)
-50EF (lin2)
-50F0 (bo2)
-50F1 (gu4)
-50F2 (xian1)
-50F3 (su4)
-50F4 (xian4)
-50F5 (jiang1)
-50F6 (min3)
-50F7 (ye4)
-50F8 (jin4)
-50F9 (jia4)
-50FA (qiao4)
-50FB (pi4)
-50FC (feng1)
-50FD (zhou4)
-50FE (ai4)
-50FF (sai4)
-5100 (yi2)
-5101 (jun4,juan4)
-5102 (nong2)
-5103 (shan4)
-5104 (yi4)
-5105 (dang1)
-5106 (jing3)
-5107 (xuan1)
-5108 (kuai4)
-5109 (jian3)
-510A (chu4)
-510B (dan1)
-510C (jiao3)
-510D (sha3)
-510E (zai4,zai3)
-510F (none0)
-5110 (bin4,bin1)
-5111 (an4)
-5112 (ru2)
-5113 (tai2)
-5114 (chou2)
-5115 (chai2)
-5116 (lan2)
-5117 (ni3)
-5118 (jin3,jin4)
-5119 (qian1)
-511A (meng2)
-511B (wu3)
-511C (neng2)
-511D (qiong2)
-511E (ni3)
-511F (chang2)
-5120 (lie4)
-5121 (lei3)
-5122 (lu:3)
-5123 (kuang3)
-5124 (bao4)
-5125 (du2)
-5126 (biao1)
-5127 (zan3)
-5128 (zhi2)
-5129 (si4)
-512A (you1)
-512B (hao2)
-512C (qin1)
-512D (chen4)
-512E (li4)
-512F (teng2)
-5130 (wei3)
-5131 (long2)
-5132 (chu3,chu2)
-5133 (chan4)
-5134 (rang2)
-5135 (shu4)
-5136 (hui4)
-5137 (li4)
-5138 (luo2)
-5139 (zan3,zuan3)
-513A (nuo2)
-513B (tang3)
-513C (yan3)
-513D (lei4)
-513E (nang4)
-513F (er2,r2)
-5140 (wu4,wu1)
-5141 (yun3)
-5142 (zan1)
-5143 (yuan2)
-5144 (xiong1)
-5145 (chong1)
-5146 (zhao4)
-5147 (xiong1)
-5148 (xian1)
-5149 (guang1)
-514A (dui4)
-514B (ke4)
-514C (dui4)
-514D (mian3,wen4)
-514E (tu4)
-514F (chang2,zhang3)
-5150 (er2)
-5151 (dui4)
-5152 (er2,er1)
-5153 (jin1)
-5154 (tu4)
-5155 (si4)
-5156 (yan3)
-5157 (yan3)
-5158 (shi3)
-5159 (shi2,ke4)
-515A (dang3)
-515B (qian1)
-515C (dou1)
-515D (fen1)
-515E (mao2)
-515F (xin1)
-5160 (dou1)
-5161 (bai3,ke4)
-5162 (jing1)
-5163 (li3)
-5164 (kuang4)
-5165 (ru4)
-5166 (wang2,wu2)
-5167 (nei4)
-5168 (quan2)
-5169 (liang3)
-516A (yu2,shu4)
-516B (ba1,ba2)
-516C (gong1)
-516D (liu4,lu4)
-516E (xi1)
-516F (none0)
-5170 (lan2)
-5171 (gong4,gong1,gong3)
-5172 (tian1)
-5173 (guan1)
-5174 (xing1,xing4)
-5175 (bing1)
-5176 (qi2,ji1)
-5177 (ju4)
-5178 (dian3)
-5179 (zi1,ci2)
-517A (none0)
-517B (yang3)
-517C (jian1)
-517D (shou4)
-517E (ji4)
-517F (yi4)
-5180 (ji4)
-5181 (chan3)
-5182 (jiong1)
-5183 (mao4)
-5184 (ran3)
-5185 (nei4)
-5186 (yuan2)
-5187 (mao3,mou3)
-5188 (gang1)
-5189 (ran3)
-518A (ce4)
-518B (jiong1)
-518C (ce4)
-518D (zai4)
-518E (gua3)
-518F (jiong3)
-5190 (mao4,mo4)
-5191 (zhou4)
-5192 (mao4,mo4)
-5193 (gou4)
-5194 (xu3)
-5195 (mian3)
-5196 (mi4)
-5197 (rong3)
-5198 (yin2)
-5199 (xie3,xie4)
-519A (kan3)
-519B (jun1)
-519C (nong2)
-519D (yi2)
-519E (mi2)
-519F (shi4)
-51A0 (guan1,guan4)
-51A1 (meng2)
-51A2 (zhong3)
-51A3 (zui4)
-51A4 (yuan1)
-51A5 (ming2)
-51A6 (kou4)
-51A7 (none0)
-51A8 (fu4)
-51A9 (xie3)
-51AA (mi4)
-51AB (bing1)
-51AC (dong1)
-51AD (tai4)
-51AE (gang1)
-51AF (feng2,ping2)
-51B0 (bing1)
-51B1 (hu4)
-51B2 (chong1,chong4)
-51B3 (jue2)
-51B4 (hu4)
-51B5 (kuang4)
-51B6 (ye3)
-51B7 (leng3)
-51B8 (pan4)
-51B9 (fu3)
-51BA (min3)
-51BB (dong4)
-51BC (xian3)
-51BD (lie4)
-51BE (xia2)
-51BF (jian1)
-51C0 (jing4)
-51C1 (shu4)
-51C2 (mei3)
-51C3 (shang4)
-51C4 (qi1)
-51C5 (gu4)
-51C6 (zhun3)
-51C7 (song1)
-51C8 (jing4)
-51C9 (liang2,liang4)
-51CA (qing4,jing4)
-51CB (diao1)
-51CC (ling2)
-51CD (dong4)
-51CE (gan4)
-51CF (jian3)
-51D0 (yin1,yin2)
-51D1 (cou4)
-51D2 (ai2)
-51D3 (li4)
-51D4 (cang1)
-51D5 (ming3)
-51D6 (zhun3)
-51D7 (cui2)
-51D8 (si1)
-51D9 (duo2)
-51DA (jin4)
-51DB (lin3)
-51DC (lin3)
-51DD (ning2)
-51DE (xi1)
-51DF (du2)
-51E0 (ji3,ji1)
-51E1 (fan2)
-51E2 (fan2)
-51E3 (fan2)
-51E4 (feng4)
-51E5 (ju1)
-51E6 (chu3,chu4)
-51E7 (none0)
-51E8 (feng1)
-51E9 (none0)
-51EA (none0)
-51EB (fu2)
-51EC (feng1)
-51ED (ping2)
-51EE (feng1)
-51EF (kai3)
-51F0 (huang2)
-51F1 (kai3)
-51F2 (gan1)
-51F3 (deng4)
-51F4 (ping2)
-51F5 (qu1,kan3)
-51F6 (xiong1)
-51F7 (kuai4)
-51F8 (tu1,tu2,gu3)
-51F9 (ao1,wa1)
-51FA (chu1)
-51FB (ji1)
-51FC (dang4)
-51FD (han2)
-51FE (han2)
-51FF (zao2,zuo4)
-5200 (dao1)
-5201 (diao1)
-5202 (dao1)
-5203 (ren4)
-5204 (ren4)
-5205 (chuang1)
-5206 (fen1,fen4)
-5207 (qie4,qie1)
-5208 (yi4)
-5209 (ji4)
-520A (kan1)
-520B (qian4)
-520C (cun3)
-520D (chu2)
-520E (wen3)
-520F (ji1)
-5210 (dan3)
-5211 (xing2)
-5212 (hua4,hua2,huai5)
-5213 (wan2)
-5214 (jue2)
-5215 (li2)
-5216 (yue4)
-5217 (lie4)
-5218 (liu2)
-5219 (ze2)
-521A (gang1)
-521B (chuang4,chuang1)
-521C (fu2)
-521D (chu1)
-521E (qu4)
-521F (ju1)
-5220 (shan1)
-5221 (min3)
-5222 (ling2)
-5223 (zhong1)
-5224 (pan4)
-5225 (bie2)
-5226 (jie2)
-5227 (jie2)
-5228 (bao4,pao2)
-5229 (li4)
-522A (shan1)
-522B (bie2,bie4)
-522C (chan3)
-522D (jing3)
-522E (gua1)
-522F (gen1)
-5230 (dao4)
-5231 (chuang4)
-5232 (kui1)
-5233 (ku1)
-5234 (duo4)
-5235 (er4)
-5236 (zhi4)
-5237 (shua1,shua4)
-5238 (quan4,xuan4)
-5239 (cha4,sha1)
-523A (ci4,ci1)
-523B (ke4,ke1)
-523C (jie2)
-523D (gui4)
-523E (ci4)
-523F (gui4)
-5240 (kai3)
-5241 (duo4)
-5242 (ji4)
-5243 (ti4)
-5244 (jing3)
-5245 (lou2)
-5246 (luo2)
-5247 (ze2)
-5248 (yuan1)
-5249 (cuo4)
-524A (xue1,xiao1,xue4)
-524B (ke4)
-524C (la4,la2)
-524D (qian2)
-524E (cha4)
-524F (chuan4)
-5250 (gua3)
-5251 (jian4)
-5252 (cuo4)
-5253 (li2)
-5254 (ti1)
-5255 (fei4)
-5256 (pou1,pou3,po3)
-5257 (chan3)
-5258 (qi2)
-5259 (chuang4)
-525A (zi4)
-525B (gang1)
-525C (wan1)
-525D (bo1)
-525E (ji1,ji3)
-525F (duo1)
-5260 (qing2)
-5261 (yan3,shan4)
-5262 (zhuo2)
-5263 (jian4)
-5264 (ji4)
-5265 (bo1,bao1)
-5266 (yan1)
-5267 (ju4)
-5268 (huo4)
-5269 (sheng4)
-526A (jian3)
-526B (duo2)
-526C (duan1)
-526D (wu1)
-526E (gua3)
-526F (fu4)
-5270 (sheng4)
-5271 (jian4)
-5272 (ge1)
-5273 (zha2)
-5274 (kai3)
-5275 (chuang4,chuang1)
-5276 (juan1)
-5277 (chan3)
-5278 (tuan2,zhuan1)
-5279 (lu4)
-527A (li2)
-527B (fou2)
-527C (shan1)
-527D (piao1,piao4)
-527E (kou1)
-527F (jiao3,chao1,jia3)
-5280 (gua1)
-5281 (qiao1)
-5282 (jue2)
-5283 (hua4,hua2)
-5284 (zha2)
-5285 (zhuo2)
-5286 (lian2)
-5287 (ju4)
-5288 (pi1,pi3)
-5289 (liu2)
-528A (gui4)
-528B (jiao3)
-528C (gui4)
-528D (jian4)
-528E (jian4)
-528F (tang1)
-5290 (huo1)
-5291 (ji4)
-5292 (jian4)
-5293 (yi4)
-5294 (jian4)
-5295 (zhi4)
-5296 (chan2)
-5297 (cuan2)
-5298 (mo2)
-5299 (li2)
-529A (zhu2)
-529B (li4)
-529C (ya4)
-529D (quan4)
-529E (ban4)
-529F (gong1)
-52A0 (jia1)
-52A1 (wu4)
-52A2 (mai4)
-52A3 (lie4)
-52A4 (jing4)
-52A5 (keng1)
-52A6 (xie2)
-52A7 (zhi3)
-52A8 (dong4)
-52A9 (zhu4)
-52AA (nu3,nao2)
-52AB (jie2)
-52AC (qu2)
-52AD (shao4)
-52AE (yi4)
-52AF (zhu1)
-52B0 (mo4)
-52B1 (li4)
-52B2 (jing4,jin4)
-52B3 (lao2)
-52B4 (lao2)
-52B5 (juan4)
-52B6 (kou3)
-52B7 (yang2)
-52B8 (wa1)
-52B9 (xiao4)
-52BA (mou2)
-52BB (kuang1)
-52BC (jie2)
-52BD (lie4)
-52BE (he2)
-52BF (shi4)
-52C0 (ke4)
-52C1 (jing4,jin4)
-52C2 (hao2)
-52C3 (bo2)
-52C4 (min3)
-52C5 (chi4)
-52C6 (lang2)
-52C7 (yong3)
-52C8 (yong3)
-52C9 (mian3)
-52CA (ke4)
-52CB (xun1)
-52CC (juan4)
-52CD (qing2)
-52CE (lu4)
-52CF (bu4)
-52D0 (meng3)
-52D1 (lai4)
-52D2 (le4,lei1)
-52D3 (kai4)
-52D4 (mian3)
-52D5 (dong4)
-52D6 (xu4)
-52D7 (xu4)
-52D8 (kan1,kan4)
-52D9 (wu4)
-52DA (yi4)
-52DB (xun1)
-52DC (weng3)
-52DD (sheng4,sheng1)
-52DE (lao2,lao4)
-52DF (mu4)
-52E0 (lu4)
-52E1 (piao1)
-52E2 (shi4)
-52E3 (ji1)
-52E4 (qin2)
-52E5 (qiang3)
-52E6 (jiao3,chao1)
-52E7 (quan4)
-52E8 (xiang4)
-52E9 (yi4)
-52EA (qiao1)
-52EB (fan2)
-52EC (juan1)
-52ED (tong2)
-52EE (ju4)
-52EF (dan1)
-52F0 (xie2)
-52F1 (mai4)
-52F2 (xun1)
-52F3 (xun1)
-52F4 (lu:4)
-52F5 (li4)
-52F6 (che4)
-52F7 (rang2)
-52F8 (quan4)
-52F9 (bao1)
-52FA (shao2,shuo4,biao1)
-52FB (yun2)
-52FC (jiu1)
-52FD (bao4)
-52FE (gou1,gou4)
-52FF (wu4)
-5300 (yun2)
-5301 (none0)
-5302 (none0)
-5303 (gai4)
-5304 (gai4)
-5305 (bao1)
-5306 (cong1)
-5307 (none0)
-5308 (xiong1)
-5309 (peng1)
-530A (ju2)
-530B (tao2)
-530C (ge2)
-530D (pu2)
-530E (an4)
-530F (pao2)
-5310 (fu2)
-5311 (gong1)
-5312 (da2)
-5313 (jiu4)
-5314 (qiong1)
-5315 (bi3)
-5316 (hua4,hua1)
-5317 (bei3)
-5318 (nao3)
-5319 (chi2,shi5)
-531A (fang1,xi3)
-531B (jiu4)
-531C (yi2)
-531D (za1)
-531E (jiang4)
-531F (kang4)
-5320 (jiang4)
-5321 (kuang1)
-5322 (hu1)
-5323 (xia2)
-5324 (qu1)
-5325 (fan2)
-5326 (gui3)
-5327 (qie4)
-5328 (cang2,zang4)
-5329 (kuang1)
-532A (fei3)
-532B (hu1)
-532C (yu3)
-532D (gui3)
-532E (kui4)
-532F (hui4)
-5330 (dan1)
-5331 (kui4)
-5332 (lian2)
-5333 (lian2)
-5334 (suan3)
-5335 (du2)
-5336 (jiu4)
-5337 (qu2)
-5338 (xi4)
-5339 (pi3,pi1,ya3)
-533A (qu1,ou1)
-533B (yi1)
-533C (an4)
-533D (yan3)
-533E (bian3)
-533F (ni4)
-5340 (qu1,ou1)
-5341 (shi2)
-5342 (xin4)
-5343 (qian1)
-5344 (nian4)
-5345 (sa4)
-5346 (zu2)
-5347 (sheng1)
-5348 (wu3)
-5349 (hui4)
-534A (ban4)
-534B (shi4)
-534C (xi4)
-534D (wan4)
-534E (hua2,hua4,hua1)
-534F (xie2)
-5350 (wan4)
-5351 (bei1)
-5352 (zu2,cu4)
-5353 (zhuo2,zhuo1)
-5354 (xie2)
-5355 (dan1,chan2,shan4)
-5356 (mai4)
-5357 (nan2,na1)
-5358 (dan1,chan2)
-5359 (ji2)
-535A (bo2)
-535B (shuai4,lu:4)
-535C (bu3,bo5)
-535D (kuang4)
-535E (bian4)
-535F (bu3)
-5360 (zhan4,zhan1)
-5361 (ka3,qia3)
-5362 (lu2)
-5363 (you3)
-5364 (lu3)
-5365 (xi1)
-5366 (gua4)
-5367 (wo4)
-5368 (xie4)
-5369 (jie2)
-536A (jie2)
-536B (wei4)
-536C (ang2,yang3)
-536D (qiong2)
-536E (zhi1)
-536F (mao3)
-5370 (yin4)
-5371 (wei1,wei2)
-5372 (shao4)
-5373 (ji2)
-5374 (que4)
-5375 (luan3)
-5376 (shi4)
-5377 (juan3,juan4,quan2)
-5378 (xie4)
-5379 (xu4)
-537A (jin3)
-537B (que4)
-537C (wu4)
-537D (ji2)
-537E (e4)
-537F (qing1)
-5380 (xi1)
-5381 (none0)
-5382 (chang3,han3,an1)
-5383 (han3)
-5384 (e4)
-5385 (ting1)
-5386 (li4)
-5387 (zhe2)
-5388 (an1,chang3)
-5389 (li4)
-538A (ya3)
-538B (ya1,ya4)
-538C (yan4)
-538D (she4)
-538E (zhi3)
-538F (zha3)
-5390 (pang2)
-5391 (none0)
-5392 (ke4)
-5393 (ya2)
-5394 (zhi4)
-5395 (ce4,si5)
-5396 (pang2)
-5397 (ti2)
-5398 (li2)
-5399 (she4)
-539A (hou4)
-539B (ting1)
-539C (zui1)
-539D (cuo4)
-539E (fei4)
-539F (yuan2)
-53A0 (ce4,si5)
-53A1 (yuan2)
-53A2 (xiang1)
-53A3 (yan3)
-53A4 (li4)
-53A5 (jue2)
-53A6 (sha4,xia4)
-53A7 (dian1)
-53A8 (chu2)
-53A9 (jiu4)
-53AA (qin2,jin3)
-53AB (ao2)
-53AC (gui3)
-53AD (yan4,yan1)
-53AE (si1)
-53AF (li4)
-53B0 (chang3,an1)
-53B1 (lan2)
-53B2 (li4)
-53B3 (yan2)
-53B4 (yan3)
-53B5 (yuan2)
-53B6 (si1)
-53B7 (si1)
-53B8 (lin2)
-53B9 (qiu2)
-53BA (qu4)
-53BB (qu4)
-53BC (none0)
-53BD (lei3)
-53BE (du1)
-53BF (xian4)
-53C0 (zhuan1)
-53C1 (san1)
-53C2 (can1,cen1,shen1)
-53C3 (can1,cen1,shen1,san1)
-53C4 (san1)
-53C5 (can1,cen1,shen1)
-53C6 (ai4)
-53C7 (dai4)
-53C8 (you4)
-53C9 (cha1,cha2,cha3,cha4)
-53CA (ji2)
-53CB (you3)
-53CC (shuang1)
-53CD (fan3)
-53CE (shou1)
-53CF (guai4)
-53D0 (ba2)
-53D1 (fa1,fa4)
-53D2 (ruo4)
-53D3 (shi4)
-53D4 (shu1,shu2)
-53D5 (zhui4)
-53D6 (qu3)
-53D7 (shou4)
-53D8 (bian4)
-53D9 (xu4)
-53DA (jia3)
-53DB (pan4)
-53DC (sou3)
-53DD (ji2)
-53DE (yu4)
-53DF (sou3)
-53E0 (die2)
-53E1 (rui4)
-53E2 (cong2)
-53E3 (kou3)
-53E4 (gu3)
-53E5 (ju4,gou1)
-53E6 (ling4)
-53E7 (gua3)
-53E8 (tao1,dao1,dao2)
-53E9 (kou4)
-53EA (zhi3,zhi1)
-53EB (jiao4)
-53EC (zhao4,shao4,zhao1)
-53ED (ba1)
-53EE (ding1)
-53EF (ke3,ke4)
-53F0 (tai2,tai1)
-53F1 (chi4)
-53F2 (shi3)
-53F3 (you4)
-53F4 (qiu2)
-53F5 (po3)
-53F6 (ye4,xie2)
-53F7 (hao4,hao2)
-53F8 (si1)
-53F9 (tan4)
-53FA (chi3)
-53FB (le4)
-53FC (diao1)
-53FD (ji1)
-53FE (none0)
-53FF (hong1)
-5400 (mie1)
-5401 (yu4,xu1,yu1)
-5402 (mang2)
-5403 (chi1,ji2)
-5404 (ge4,ge3)
-5405 (xuan1)
-5406 (yao1)
-5407 (zi3)
-5408 (he2,ge3)
-5409 (ji2)
-540A (diao4)
-540B (cun4)
-540C (tong2,tong4)
-540D (ming2)
-540E (hou4)
-540F (li4)
-5410 (tu3,tu4)
-5411 (xiang4)
-5412 (zha4,zha1)
-5413 (he4,xia4)
-5414 (ye3)
-5415 (lu:3)
-5416 (a1)
-5417 (ma5,ma3,ma2)
-5418 (ou3)
-5419 (xue1)
-541A (yi1)
-541B (jun1)
-541C (chou3)
-541D (lin4)
-541E (tun1)
-541F (yin2)
-5420 (fei4)
-5421 (bi3,pi3)
-5422 (qin4)
-5423 (qin4)
-5424 (jie4)
-5425 (pou1)
-5426 (fou3,pi3)
-5427 (ba5,ba1)
-5428 (dun1)
-5429 (fen1)
-542A (e2)
-542B (han2)
-542C (ting1,yin3)
-542D (hang2,keng1)
-542E (shun3)
-542F (qi3)
-5430 (hu1)
-5431 (zhi1,zi1)
-5432 (yin3)
-5433 (wu2)
-5434 (wu2)
-5435 (chao3,chao1)
-5436 (na4)
-5437 (chuo4)
-5438 (xi1)
-5439 (chui1,chui4)
-543A (dou1)
-543B (wen3)
-543C (hou3)
-543D (ou2,hong1)
-543E (wu2)
-543F (gao4,gu4)
-5440 (ya1,ya5)
-5441 (jun4)
-5442 (lu:3)
-5443 (e4,e5)
-5444 (ge2)
-5445 (mei2)
-5446 (dai1,ai2)
-5447 (qi3)
-5448 (cheng2)
-5449 (wu2)
-544A (gao4,gu4)
-544B (fu1)
-544C (jiao4)
-544D (hong1)
-544E (chi3)
-544F (sheng1)
-5450 (na4,na5,ne4,ne5)
-5451 (tun1)
-5452 (m2)
-5453 (yi4)
-5454 (dai1,tai3)
-5455 (ou3,ou4)
-5456 (li4)
-5457 (bei5,bai4)
-5458 (yuan2,yun2,yun4)
-5459 (guo1)
-545A (none0)
-545B (qiang1,qiang4)
-545C (wu1)
-545D (e4)
-545E (shi1)
-545F (quan3)
-5460 (pen3)
-5461 (wen3)
-5462 (ni2,ne5,na4,ne4)
-5463 (mou2)
-5464 (ling4)
-5465 (ran3)
-5466 (you1)
-5467 (di3)
-5468 (zhou1)
-5469 (shi4)
-546A (zhou4)
-546B (zhan1)
-546C (ling2)
-546D (yi4)
-546E (qi4)
-546F (ping2)
-5470 (zi3)
-5471 (gua1,gu1,wa1,gua3)
-5472 (ci1,zi1)
-5473 (wei4)
-5474 (xu1)
-5475 (he1,ke1,a1,a2,a3,a4,a5)
-5476 (nao2)
-5477 (xia1,xia2)
-5478 (pei1)
-5479 (yi4)
-547A (xiao1)
-547B (shen1)
-547C (hu1)
-547D (ming4)
-547E (da2)
-547F (qu1)
-5480 (ju3,zui3)
-5481 (gan1)
-5482 (za1)
-5483 (tuo1)
-5484 (duo1,duo4)
-5485 (pou3)
-5486 (pao2)
-5487 (bie2)
-5488 (fu2)
-5489 (bi4,fu2)
-548A (he2,he4,huo2,huo4,huo5)
-548B (za3,ze2,zha1,zha4)
-548C (he2,he4,huo2,huo4,huo5,hai1,he5,hu2)
-548D (hai1)
-548E (jiu4)
-548F (yong3)
-5490 (fu4,fu5)
-5491 (da1)
-5492 (zhou4)
-5493 (wa3)
-5494 (ka3,ka1)
-5495 (gu1)
-5496 (ka1,ga1)
-5497 (zuo3)
-5498 (bu4)
-5499 (long2)
-549A (dong1)
-549B (ning2)
-549C (zha4)
-549D (si1)
-549E (xian4)
-549F (huo4)
-54A0 (qi1)
-54A1 (er4)
-54A2 (e4)
-54A3 (guang1)
-54A4 (zha4)
-54A5 (xi4,die2)
-54A6 (yi2)
-54A7 (lie3,lie1,lie5)
-54A8 (zi1)
-54A9 (mie1)
-54AA (mi1)
-54AB (zhi3)
-54AC (yao3)
-54AD (ji1)
-54AE (zhou4)
-54AF (ge1,ka3,lo5,luo4,ge2)
-54B0 (shuai4)
-54B1 (zan2,za2,zan5)
-54B2 (xiao4)
-54B3 (ke2,hai1,ka3,kai4)
-54B4 (hui1)
-54B5 (kua1)
-54B6 (huai4)
-54B7 (tao2)
-54B8 (xian2)
-54B9 (e4)
-54BA (xuan3)
-54BB (xiu1)
-54BC (guo1,kuai1)
-54BD (yan1,yan4,ye4)
-54BE (lao3)
-54BF (yi1)
-54C0 (ai1)
-54C1 (pin3)
-54C2 (shen3)
-54C3 (tong2)
-54C4 (hong1,hong3,hong4)
-54C5 (xiong1,hong1)
-54C6 (duo1)
-54C7 (wa1,wa5)
-54C8 (ha1,ha3,ha4,ka1)
-54C9 (zai1)
-54CA (you4)
-54CB (di4)
-54CC (pai4)
-54CD (xiang3)
-54CE (ai1,ai3,ai4)
-54CF (gen2)
-54D0 (kuang1)
-54D1 (ya1,ya3)
-54D2 (da1)
-54D3 (xiao1)
-54D4 (bi4)
-54D5 (hui4,yue3)
-54D6 (none0)
-54D7 (hua1,hua2,ye4)
-54D8 (none0)
-54D9 (kuai4)
-54DA (duo3)
-54DB (none0)
-54DC (ji4)
-54DD (nong2)
-54DE (mou1)
-54DF (yo5,yo1)
-54E0 (hao4)
-54E1 (yuan2,yun2,yun4)
-54E2 (long4)
-54E3 (pou3)
-54E4 (mang2)
-54E5 (ge1)
-54E6 (e2,o2,o4,wo2,wo4)
-54E7 (chi1)
-54E8 (shao4)
-54E9 (li1,li3,li5)
-54EA (na3,nei3,na5,ne2,nai3)
-54EB (zu2)
-54EC (he1)
-54ED (ku1)
-54EE (xiao4,xiao1)
-54EF (xian4)
-54F0 (lao2)
-54F1 (bei4)
-54F2 (zhe2)
-54F3 (zha1)
-54F4 (liang4)
-54F5 (ba1)
-54F6 (mi3)
-54F7 (le4)
-54F8 (sui1)
-54F9 (fou2)
-54FA (bu3)
-54FB (han4)
-54FC (heng1,hng5)
-54FD (geng3)
-54FE (shuo1)
-54FF (ge3)
-5500 (you4)
-5501 (yan4)
-5502 (gu3)
-5503 (gu3)
-5504 (bai4,bei5)
-5505 (han1)
-5506 (suo1)
-5507 (chun2)
-5508 (yi4)
-5509 (ai1,ai4)
-550A (jia2)
-550B (tu3)
-550C (xian2)
-550D (guan1,guan3)
-550E (li4)
-550F (xi1)
-5510 (tang2)
-5511 (zuo4)
-5512 (miu1)
-5513 (che1)
-5514 (wu2,n2,n3,ng2,ng3)
-5515 (zao4)
-5516 (ya1)
-5517 (dou3)
-5518 (qi3)
-5519 (di2)
-551A (qin4)
-551B (ma4)
-551C (none0)
-551D (gong4)
-551E (dou3)
-551F (none0)
-5520 (lao2,lao4)
-5521 (liang3)
-5522 (suo3)
-5523 (zao4)
-5524 (huan4)
-5525 (none0)
-5526 (gou4)
-5527 (ji1)
-5528 (zuo3)
-5529 (wo1)
-552A (feng3)
-552B (yin2)
-552C (hu3,xia4)
-552D (qi1)
-552E (shou4)
-552F (wei2,wei3)
-5530 (shua1)
-5531 (chang4)
-5532 (er2)
-5533 (li4)
-5534 (qiang4)
-5535 (an3)
-5536 (jie4)
-5537 (yo1)
-5538 (nian4)
-5539 (yu2)
-553A (tian3)
-553B (lai2)
-553C (sha4)
-553D (xi1)
-553E (tuo4)
-553F (hu1)
-5540 (ai2)
-5541 (zhou1,zhao1)
-5542 (nou4)
-5543 (ken3)
-5544 (zhuo2)
-5545 (zhuo2)
-5546 (shang1)
-5547 (di1)
-5548 (heng4)
-5549 (lin2)
-554A (a5,a1,a2,a3,a4)
-554B (xiao1)
-554C (xiang1)
-554D (tun1)
-554E (wu3)
-554F (wen4)
-5550 (cui4)
-5551 (jie1)
-5552 (hu1)
-5553 (qi3)
-5554 (qi3)
-5555 (tao2)
-5556 (dan4)
-5557 (dan4)
-5558 (wan3)
-5559 (zi3)
-555A (bi3)
-555B (cui4)
-555C (chuo4,chuai4)
-555D (he2)
-555E (ya3,ya1)
-555F (qi3)
-5560 (zhe2)
-5561 (fei1)
-5562 (liang3)
-5563 (xian2)
-5564 (pi2)
-5565 (sha2)
-5566 (la5,la1)
-5567 (ze2)
-5568 (qing1)
-5569 (gua4)
-556A (pa1)
-556B (zhe3)
-556C (se4)
-556D (zhuan4)
-556E (nie4)
-556F (guo1)
-5570 (luo1)
-5571 (yan1)
-5572 (di4)
-5573 (quan2)
-5574 (tan1,chan3)
-5575 (bo5)
-5576 (ding4)
-5577 (lang1)
-5578 (xiao4)
-5579 (none0)
-557A (tang2)
-557B (chi4)
-557C (ti2)
-557D (an2)
-557E (jiu1)
-557F (dan4)
-5580 (ka1,ke4,ka4)
-5581 (yong2)
-5582 (wei4)
-5583 (nan2)
-5584 (shan4)
-5585 (yu4)
-5586 (zhe2)
-5587 (la3,la1,la2)
-5588 (jie1)
-5589 (hou2)
-558A (han3)
-558B (die2,zha2)
-558C (zhou1)
-558D (chai2)
-558E (kuai1)
-558F (re3,nuo4)
-5590 (yu4)
-5591 (yin1)
-5592 (zan3)
-5593 (yao1)
-5594 (wo1,o1)
-5595 (mian3)
-5596 (hu2)
-5597 (yun3)
-5598 (chuan3)
-5599 (hui4)
-559A (huan4)
-559B (huan4)
-559C (xi3)
-559D (he1,he4)
-559E (ji1)
-559F (kui4)
-55A0 (zhong3)
-55A1 (wei3)
-55A2 (sha4)
-55A3 (xu3)
-55A4 (huang2)
-55A5 (du4)
-55A6 (nie4)
-55A7 (xuan1)
-55A8 (liang4)
-55A9 (yu4)
-55AA (sang1,sang4)
-55AB (chi1)
-55AC (qiao2)
-55AD (yan4)
-55AE (dan1,chan2,shan4)
-55AF (pen1)
-55B0 (shi2,si4)
-55B1 (li2)
-55B2 (yo5,yo1)
-55B3 (zha1,cha1)
-55B4 (wei1)
-55B5 (miao1)
-55B6 (ying2)
-55B7 (pen1,pen4,pen5)
-55B8 (none0)
-55B9 (kui2)
-55BA (xi4)
-55BB (yu4)
-55BC (jie2)
-55BD (lou5,lou2)
-55BE (ku4)
-55BF (cao1)
-55C0 (huo4)
-55C1 (ti2)
-55C2 (yao2)
-55C3 (he4)
-55C4 (a2,sha4)
-55C5 (xiu4)
-55C6 (qiang1,qiang4)
-55C7 (se4)
-55C8 (yong1)
-55C9 (su4)
-55CA (hong3)
-55CB (xie1)
-55CC (ai4,yi4)
-55CD (suo1)
-55CE (ma5,ma3)
-55CF (cha1)
-55D0 (hai4)
-55D1 (ke4,ke1)
-55D2 (da1,ta4)
-55D3 (sang3)
-55D4 (chen1)
-55D5 (ru4,nou4)
-55D6 (sou1)
-55D7 (gong1)
-55D8 (ji1)
-55D9 (pang3)
-55DA (wu1)
-55DB (qian4)
-55DC (shi4)
-55DD (ge2)
-55DE (zi1)
-55DF (jie1,jue1)
-55E0 (luo4)
-55E1 (weng1)
-55E2 (wa4)
-55E3 (si4)
-55E4 (chi1)
-55E5 (hao2)
-55E6 (suo1)
-55E7 (jia1,lun2)
-55E8 (hai1,hei1)
-55E9 (suo3)
-55EA (qin2)
-55EB (nie4)
-55EC (he1)
-55ED (none0)
-55EE (sai4)
-55EF (ng4,ng2,ng3,n2,n3,n4)
-55F0 (ge4)
-55F1 (na2)
-55F2 (dia3)
-55F3 (ai4,ai3)
-55F4 (none0)
-55F5 (tong1)
-55F6 (bi4)
-55F7 (ao2)
-55F8 (ao2)
-55F9 (lian2)
-55FA (cui1)
-55FB (zhe1)
-55FC (mo4)
-55FD (sou4)
-55FE (sou3,zu2)
-55FF (tan3)
-5600 (di2,di1)
-5601 (qi1)
-5602 (jiao4)
-5603 (chong1)
-5604 (jiao1)
-5605 (kai3)
-5606 (tan4)
-5607 (san1)
-5608 (cao2)
-5609 (jia1)
-560A (none0)
-560B (xiao1)
-560C (piao4)
-560D (lou5,lou2)
-560E (ga1,ga3,ga2)
-560F (gu3,jia3)
-5610 (xiao1)
-5611 (hu1)
-5612 (hui4)
-5613 (guo1)
-5614 (ou1,ou3,ou4)
-5615 (xian1)
-5616 (ze2)
-5617 (chang2)
-5618 (xu1,shi1)
-5619 (po2)
-561A (de1,dei1)
-561B (ma5,ma2)
-561C (ma4,ma3,mo4)
-561D (hu2)
-561E (lei5)
-561F (du1)
-5620 (ga1)
-5621 (tang1)
-5622 (ye3)
-5623 (beng1)
-5624 (ying1)
-5625 (none0)
-5626 (jiao4)
-5627 (mi4)
-5628 (xiao4)
-5629 (hua1,hua2,ye4)
-562A (mai3)
-562B (ran2)
-562C (zuo1,chuai4,zhuai4)
-562D (peng1)
-562E (lao2,lao4)
-562F (xiao4)
-5630 (ji1)
-5631 (zhu3)
-5632 (chao2,zhao1)
-5633 (kui4)
-5634 (zui3)
-5635 (xiao1)
-5636 (si1)
-5637 (hao2)
-5638 (fu3,m2)
-5639 (liao2)
-563A (qiao2)
-563B (xi1)
-563C (xu4)
-563D (chan3)
-563E (dan4)
-563F (hei1,mo4,hai1)
-5640 (xun4)
-5641 (wu4)
-5642 (zun3)
-5643 (pan2)
-5644 (chi1)
-5645 (kui1)
-5646 (can3)
-5647 (zan3)
-5648 (cu4)
-5649 (dan4)
-564A (yu4)
-564B (tun1)
-564C (cheng1,ceng1)
-564D (jiao4)
-564E (ye1)
-564F (xi1)
-5650 (qi4)
-5651 (hao2)
-5652 (lian2)
-5653 (xu1,shi1)
-5654 (deng1)
-5655 (hui1)
-5656 (yin2)
-5657 (pu1)
-5658 (jue1)
-5659 (qin2)
-565A (xun2)
-565B (nie4)
-565C (lu1)
-565D (si1)
-565E (yan4)
-565F (ying4)
-5660 (da1)
-5661 (zhan1)
-5662 (o1)
-5663 (zhou4)
-5664 (jin4)
-5665 (nong2)
-5666 (hui4,yue1)
-5667 (hui4)
-5668 (qi4)
-5669 (e4)
-566A (zao4)
-566B (yi1,yi4)
-566C (shi4)
-566D (jiao4)
-566E (yuan4)
-566F (ai4,ai3)
-5670 (yong1)
-5671 (xue2,jue2)
-5672 (kuai4)
-5673 (yu3)
-5674 (pen1,pen4)
-5675 (dao4)
-5676 (ga2)
-5677 (xin1)
-5678 (dun1,dun4)
-5679 (dang1)
-567A (none0)
-567B (sai1)
-567C (pi1)
-567D (pi3)
-567E (yin1)
-567F (zui3)
-5680 (ning2)
-5681 (di2)
-5682 (han3)
-5683 (ta4)
-5684 (huo4,huo1,o3)
-5685 (ru2)
-5686 (hao1)
-5687 (xia4,he4)
-5688 (yan4)
-5689 (duo1)
-568A (pi4)
-568B (chou2)
-568C (ji4)
-568D (jin4)
-568E (hao2)
-568F (ti4)
-5690 (chang2)
-5691 (none0)
-5692 (none0)
-5693 (ca1,cha1)
-5694 (ti4)
-5695 (lu1)
-5696 (hui4)
-5697 (bao4)
-5698 (you1)
-5699 (nie4)
-569A (yin2)
-569B (hu4)
-569C (mo4)
-569D (huang1)
-569E (zhe2)
-569F (li2)
-56A0 (liu2)
-56A1 (none0)
-56A2 (nang2,nang1)
-56A3 (xiao1,ao2)
-56A4 (mo2)
-56A5 (yan4)
-56A6 (li4)
-56A7 (lu2)
-56A8 (long2)
-56A9 (mo2)
-56AA (dan1)
-56AB (chen4)
-56AC (pin2)
-56AD (pi3)
-56AE (xiang4)
-56AF (huo4)
-56B0 (mo2)
-56B1 (xi1)
-56B2 (duo3)
-56B3 (ku4)
-56B4 (yan2)
-56B5 (chan2)
-56B6 (ying1)
-56B7 (rang3,rang1)
-56B8 (dian3)
-56B9 (la1)
-56BA (ta4)
-56BB (xiao1)
-56BC (jiao2,jiao4,jue2)
-56BD (chuo4)
-56BE (huan4)
-56BF (huo4)
-56C0 (zhuan4,zhuan3)
-56C1 (nie4)
-56C2 (xiao1,ao2)
-56C3 (ca4)
-56C4 (li2)
-56C5 (chan3)
-56C6 (chai4)
-56C7 (li4)
-56C8 (yi4)
-56C9 (luo1,luo2)
-56CA (nang2,nang1)
-56CB (zan4)
-56CC (su1)
-56CD (xi3)
-56CE (none0)
-56CF (jian1)
-56D0 (za2)
-56D1 (zhu3)
-56D2 (lan2)
-56D3 (nie4)
-56D4 (nang1)
-56D5 (none0)
-56D6 (none0)
-56D7 (wei2)
-56D8 (hui2)
-56D9 (yin1)
-56DA (qiu2)
-56DB (si4)
-56DC (nin2)
-56DD (jian3,nan1)
-56DE (hui2)
-56DF (xin4)
-56E0 (yin1)
-56E1 (nan1)
-56E2 (tuan2)
-56E3 (tuan2)
-56E4 (dun4,tun2)
-56E5 (kang4)
-56E6 (yuan1)
-56E7 (jiong3)
-56E8 (pian1)
-56E9 (yun4)
-56EA (cong1,chuang1)
-56EB (hu2)
-56EC (hui2)
-56ED (yuan2)
-56EE (e2)
-56EF (guo2)
-56F0 (kun4)
-56F1 (cong1)
-56F2 (wei2)
-56F3 (tu2)
-56F4 (wei2)
-56F5 (lun2)
-56F6 (guo2)
-56F7 (jun1)
-56F8 (ri4)
-56F9 (ling2)
-56FA (gu4)
-56FB (guo2)
-56FC (tai1)
-56FD (guo2)
-56FE (tu2)
-56FF (you4)
-5700 (guo2)
-5701 (yin2)
-5702 (hun4)
-5703 (pu3)
-5704 (yu3)
-5705 (han2)
-5706 (yuan2)
-5707 (lun2)
-5708 (quan1,juan1,juan4,quan3)
-5709 (yu3)
-570A (qing1)
-570B (guo2)
-570C (chui2)
-570D (wei2)
-570E (yuan2)
-570F (quan1,juan1,juan4)
-5710 (ku1)
-5711 (pu3)
-5712 (yuan2)
-5713 (yuan2)
-5714 (e4)
-5715 (tu2,shu1,guan3)
-5716 (tu2)
-5717 (tu2)
-5718 (tuan2)
-5719 (lu:e4)
-571A (hui4)
-571B (yi4)
-571C (yuan2,huan2)
-571D (luan2)
-571E (luan2)
-571F (tu3)
-5720 (ya4)
-5721 (tu3)
-5722 (ting3)
-5723 (sheng4)
-5724 (yan2)
-5725 (lu2)
-5726 (none0)
-5727 (ya1,ya4)
-5728 (zai4)
-5729 (wei2,xu1)
-572A (ge1)
-572B (yu4)
-572C (wu1)
-572D (gui1)
-572E (pi3)
-572F (yi2)
-5730 (di4,de5)
-5731 (qian1)
-5732 (qian1)
-5733 (zhen4)
-5734 (zhuo2,shao2)
-5735 (dang4)
-5736 (qia4)
-5737 (none0)
-5738 (none0)
-5739 (kuang4)
-573A (chang3,chang2,chang5)
-573B (qi2,yin2)
-573C (nie4)
-573D (mo4)
-573E (ji1)
-573F (jia2)
-5740 (zhi3)
-5741 (zhi3)
-5742 (ban3)
-5743 (xun1)
-5744 (tou2)
-5745 (qin3)
-5746 (fen2)
-5747 (jun1,yun4)
-5748 (keng1)
-5749 (dun4)
-574A (fang1,fang2)
-574B (fen4)
-574C (ben4)
-574D (tan1)
-574E (kan3)
-574F (huai4,pi1,pei1)
-5750 (zuo4)
-5751 (keng1)
-5752 (bi4)
-5753 (xing2)
-5754 (di4)
-5755 (jing1)
-5756 (ji4)
-5757 (kuai4)
-5758 (di3)
-5759 (jing1)
-575A (jian1)
-575B (tan2)
-575C (li4)
-575D (ba4)
-575E (wu4)
-575F (fen2)
-5760 (zhui4)
-5761 (po1)
-5762 (pan3)
-5763 (tang1)
-5764 (kun1)
-5765 (qu1)
-5766 (tan3)
-5767 (zhi2)
-5768 (tuo2)
-5769 (gan1)
-576A (ping2)
-576B (dian4)
-576C (wa1)
-576D (ni2)
-576E (tai2,tai1)
-576F (pi1)
-5770 (jiong1)
-5771 (yang1)
-5772 (fo2)
-5773 (ao4)
-5774 (liu4)
-5775 (qiu1)
-5776 (mu4)
-5777 (ke3,ke1)
-5778 (gou4)
-5779 (xue4)
-577A (ba2)
-577B (chi2,di3)
-577C (che4)
-577D (ling2)
-577E (zhu4)
-577F (fu4)
-5780 (hu1)
-5781 (zhi4)
-5782 (chui2)
-5783 (la1)
-5784 (long3)
-5785 (long3)
-5786 (lu2)
-5787 (ao4)
-5788 (none0)
-5789 (pao2)
-578A (none0)
-578B (xing2)
-578C (tong2,dong4)
-578D (ji4)
-578E (ke4)
-578F (lu4)
-5790 (ci2)
-5791 (chi3)
-5792 (lei3)
-5793 (gai1)
-5794 (yin1)
-5795 (hou4)
-5796 (dui1)
-5797 (zhao4)
-5798 (fu2)
-5799 (guang1)
-579A (yao2)
-579B (duo3,duo4)
-579C (duo3,duo4)
-579D (gui3)
-579E (cha2)
-579F (yang2)
-57A0 (yin2)
-57A1 (fa2)
-57A2 (gou4)
-57A3 (yuan2)
-57A4 (die2)
-57A5 (xie2)
-57A6 (ken3)
-57A7 (shang3)
-57A8 (shou3)
-57A9 (e4)
-57AA (none0)
-57AB (dian4)
-57AC (hong2)
-57AD (ya1,ya4)
-57AE (kua3)
-57AF (da5)
-57B0 (none0)
-57B1 (dang4)
-57B2 (kai3)
-57B3 (none0)
-57B4 (nao3)
-57B5 (an1)
-57B6 (xing1)
-57B7 (xian4)
-57B8 (huan4,huan2,yuan4)
-57B9 (bang1)
-57BA (pei1)
-57BB (ba4)
-57BC (yi4)
-57BD (yin4)
-57BE (han4)
-57BF (xu4)
-57C0 (chui2)
-57C1 (cen2)
-57C2 (geng3)
-57C3 (ai1)
-57C4 (peng2)
-57C5 (fang2)
-57C6 (que4)
-57C7 (yong3)
-57C8 (jun4)
-57C9 (jia2)
-57CA (di4)
-57CB (mai2,man2)
-57CC (lang4)
-57CD (xuan4)
-57CE (cheng2)
-57CF (shan1)
-57D0 (jin1)
-57D1 (zhe2)
-57D2 (lie4,le4)
-57D3 (lie4)
-57D4 (pu3,bu4,bu3)
-57D5 (cheng2)
-57D6 (none0)
-57D7 (bu4)
-57D8 (shi2)
-57D9 (xun1)
-57DA (guo1)
-57DB (jiong1)
-57DC (ye3)
-57DD (nian4)
-57DE (di1)
-57DF (yu4)
-57E0 (bu4)
-57E1 (wu4,ya1)
-57E2 (juan3)
-57E3 (sui4)
-57E4 (pi2,bei1,bi4)
-57E5 (cheng1)
-57E6 (wan3)
-57E7 (ju4)
-57E8 (lun3)
-57E9 (zheng1)
-57EA (kong1)
-57EB (zhong3)
-57EC (dong1)
-57ED (dai4)
-57EE (tan4)
-57EF (an3)
-57F0 (cai4)
-57F1 (shu2)
-57F2 (beng3)
-57F3 (kan3)
-57F4 (zhi2)
-57F5 (duo3)
-57F6 (yi4)
-57F7 (zhi2)
-57F8 (yi4)
-57F9 (pei2)
-57FA (ji1)
-57FB (zhun3)
-57FC (qi2)
-57FD (sao4)
-57FE (ju4)
-57FF (ni2,ni4)
-5800 (ku1,jue2)
-5801 (ke3)
-5802 (tang2)
-5803 (kun1)
-5804 (ni4)
-5805 (jian1)
-5806 (dui1,zui1)
-5807 (jin3)
-5808 (gang1)
-5809 (yu4)
-580A (e4,wu4)
-580B (peng2,beng4,peng4)
-580C (gu4)
-580D (tu4)
-580E (leng4,ling2)
-580F (none0)
-5810 (ya2)
-5811 (qian4)
-5812 (none0)
-5813 (an4)
-5814 (chen1)
-5815 (duo4,hui1)
-5816 (nao3)
-5817 (tu1)
-5818 (cheng2)
-5819 (yin1)
-581A (hun2)
-581B (bi4)
-581C (lian4)
-581D (guo1)
-581E (die2)
-581F (zhuan4)
-5820 (hou4)
-5821 (bao3,bu3,pu4,pu3)
-5822 (bao3)
-5823 (yu2)
-5824 (di1,ti2)
-5825 (mao2)
-5826 (jie1)
-5827 (ruan2)
-5828 (e4,ai4)
-5829 (geng4)
-582A (kan1)
-582B (zong1)
-582C (yu2)
-582D (huang2)
-582E (e4)
-582F (yao2)
-5830 (yan4)
-5831 (bao4)
-5832 (ji2)
-5833 (mei2)
-5834 (chang2,chang3)
-5835 (du3)
-5836 (tuo1)
-5837 (an3)
-5838 (feng2)
-5839 (zhong4)
-583A (jie4)
-583B (zhen1)
-583C (heng4)
-583D (gang1)
-583E (chuan3)
-583F (jian3)
-5840 (none0)
-5841 (lei3)
-5842 (gang3)
-5843 (huang1)
-5844 (leng2)
-5845 (duan4)
-5846 (wan1)
-5847 (xuan1)
-5848 (ji4)
-5849 (ji2)
-584A (kuai4)
-584B (ying2)
-584C (ta1)
-584D (cheng2)
-584E (yong3)
-584F (kai3)
-5850 (su4)
-5851 (su4)
-5852 (shi2)
-5853 (mi4)
-5854 (ta3,da5)
-5855 (weng3)
-5856 (cheng2)
-5857 (tu2)
-5858 (tang2)
-5859 (qiao1)
-585A (zhong3)
-585B (li4)
-585C (peng2)
-585D (bang4)
-585E (sai4,se4,sai1)
-585F (zang4)
-5860 (dui1)
-5861 (tian2)
-5862 (wu4)
-5863 (cheng3)
-5864 (xun1,xuan1)
-5865 (ge2)
-5866 (zhen4)
-5867 (ai4)
-5868 (gong1)
-5869 (yan2)
-586A (kan3)
-586B (tian2)
-586C (yuan2)
-586D (wen1)
-586E (xie4)
-586F (liu4)
-5870 (none0)
-5871 (lang3)
-5872 (chang2,chang3)
-5873 (peng2)
-5874 (beng1)
-5875 (chen2)
-5876 (lu4)
-5877 (lu3)
-5878 (ou1)
-5879 (qian4)
-587A (mei2)
-587B (mo4)
-587C (zhuan1)
-587D (shuang3)
-587E (shu2)
-587F (lou3)
-5880 (chi2)
-5881 (man4)
-5882 (biao1)
-5883 (jing4)
-5884 (ce4)
-5885 (shu4)
-5886 (di4)
-5887 (zhang4)
-5888 (kan4)
-5889 (yong1)
-588A (dian4)
-588B (chen3)
-588C (zhi2)
-588D (ji4)
-588E (guo1)
-588F (qiang3)
-5890 (jin3)
-5891 (di1)
-5892 (shang1)
-5893 (mu4)
-5894 (cui1)
-5895 (yan4)
-5896 (ta3,da5)
-5897 (zeng1)
-5898 (qi2)
-5899 (qiang2)
-589A (liang2)
-589B (none0)
-589C (zhui4)
-589D (qiao1)
-589E (zeng1)
-589F (xu1)
-58A0 (shan4)
-58A1 (shan4)
-58A2 (ba2)
-58A3 (pu2)
-58A4 (kuai4)
-58A5 (dong3)
-58A6 (fan2)
-58A7 (que4)
-58A8 (mo4)
-58A9 (dun1)
-58AA (dun1)
-58AB (zun1,zun3)
-58AC (zui4)
-58AD (sheng4)
-58AE (duo4,hui1)
-58AF (duo4)
-58B0 (tan2)
-58B1 (deng4,yan4)
-58B2 (mu2)
-58B3 (fen2)
-58B4 (huang2)
-58B5 (tan2)
-58B6 (da5)
-58B7 (ye4)
-58B8 (chu2)
-58B9 (none0)
-58BA (ao4)
-58BB (qiang2)
-58BC (ji1)
-58BD (qiao1)
-58BE (ken3)
-58BF (yi4)
-58C0 (pi2)
-58C1 (bi4)
-58C2 (dian4)
-58C3 (jiang1)
-58C4 (ye3)
-58C5 (yong1,yong3)
-58C6 (xue2)
-58C7 (tan2)
-58C8 (lan3)
-58C9 (ju4)
-58CA (huai4,pi1)
-58CB (dang4)
-58CC (rang3)
-58CD (qian4)
-58CE (xuan1)
-58CF (lan4)
-58D0 (mi2)
-58D1 (he4,huo4)
-58D2 (kai4)
-58D3 (ya1,ya4)
-58D4 (dao3)
-58D5 (hao2)
-58D6 (ruan2)
-58D7 (none0)
-58D8 (lei3)
-58D9 (kuang4)
-58DA (lu2)
-58DB (yan2)
-58DC (tan2)
-58DD (wei3)
-58DE (huai4,pi1)
-58DF (long3)
-58E0 (long3)
-58E1 (rui4)
-58E2 (li4)
-58E3 (lin2)
-58E4 (rang3)
-58E5 (chan2)
-58E6 (xun1)
-58E7 (yan2)
-58E8 (lei2)
-58E9 (ba4)
-58EA (none0)
-58EB (shi4)
-58EC (ren2)
-58ED (none0)
-58EE (zhuang4)
-58EF (zhuang4)
-58F0 (sheng1)
-58F1 (yi1)
-58F2 (mai4)
-58F3 (qiao4,ke2)
-58F4 (zhu3)
-58F5 (zhuang4)
-58F6 (hu2)
-58F7 (hu2)
-58F8 (kun3)
-58F9 (yi1)
-58FA (hu2)
-58FB (xu4)
-58FC (kun3)
-58FD (shou4)
-58FE (mang3)
-58FF (zun1)
-5900 (shou4)
-5901 (yi1)
-5902 (zhi3)
-5903 (gu1)
-5904 (chu3,chu4)
-5905 (xiang2)
-5906 (feng2)
-5907 (bei4)
-5908 (none0)
-5909 (bian4)
-590A (sui1)
-590B (qun1)
-590C (ling2)
-590D (fu4)
-590E (zuo4)
-590F (xia4,jia3)
-5910 (xiong4)
-5911 (none0)
-5912 (nao2)
-5913 (xia4)
-5914 (kui2)
-5915 (xi1,xi4)
-5916 (wai4)
-5917 (yuan4)
-5918 (mao3)
-5919 (su4)
-591A (duo1)
-591B (duo1)
-591C (ye4)
-591D (qing2)
-591E (none0)
-591F (gou4)
-5920 (gou4)
-5921 (qi4)
-5922 (meng4)
-5923 (meng4)
-5924 (yin2)
-5925 (huo3)
-5926 (chen4)
-5927 (da4,dai4)
-5928 (ze4)
-5929 (tian1)
-592A (tai4)
-592B (fu1,fu2)
-592C (guai4)
-592D (yao1,yao3)
-592E (yang1)
-592F (hang1,ben4)
-5930 (gao3)
-5931 (shi1)
-5932 (ben3,tao1)
-5933 (tai4)
-5934 (tou2)
-5935 (yan3)
-5936 (bi3)
-5937 (yi2)
-5938 (kua1)
-5939 (jia1,jia2,ga1)
-593A (duo2)
-593B (none0)
-593C (kuang3)
-593D (yun4)
-593E (jia1,jia2)
-593F (ba1)
-5940 (en1,mang2)
-5941 (lian2)
-5942 (huan4)
-5943 (di1)
-5944 (yan3,yan1)
-5945 (pao4)
-5946 (juan4)
-5947 (qi2,ji1)
-5948 (nai4,nai3)
-5949 (feng4)
-594A (xie2)
-594B (fen4)
-594C (dian3)
-594D (none0)
-594E (kui2)
-594F (zou4)
-5950 (huan4)
-5951 (qi4,xie4,qie4)
-5952 (kai1)
-5953 (she1)
-5954 (ben1,ben4)
-5955 (yi4)
-5956 (jiang3)
-5957 (tao4)
-5958 (zhuang3,zang4)
-5959 (ben3)
-595A (xi1)
-595B (huang3)
-595C (fei3)
-595D (diao1)
-595E (sui1)
-595F (beng1)
-5960 (dian4)
-5961 (ao4)
-5962 (she1)
-5963 (weng1)
-5964 (pan3)
-5965 (ao4)
-5966 (wu4)
-5967 (ao4)
-5968 (jiang3)
-5969 (lian2)
-596A (duo2)
-596B (yun1)
-596C (jiang3)
-596D (shi4)
-596E (fen4)
-596F (huo4)
-5970 (bei4)
-5971 (lian2)
-5972 (che3)
-5973 (nu:3,ru3)
-5974 (nu2)
-5975 (ding3)
-5976 (nai3)
-5977 (qian1)
-5978 (jian1)
-5979 (ta1)
-597A (jiu3)
-597B (nan2)
-597C (cha4)
-597D (hao3,hao4)
-597E (xian1)
-597F (fan4)
-5980 (ji3)
-5981 (shuo4)
-5982 (ru2)
-5983 (fei1)
-5984 (wang4)
-5985 (hong2)
-5986 (zhuang1)
-5987 (fu4)
-5988 (ma1)
-5989 (dan1)
-598A (ren4)
-598B (fu1)
-598C (jing4)
-598D (yan2)
-598E (xie4)
-598F (wen4)
-5990 (zhong1)
-5991 (pa1)
-5992 (du4)
-5993 (ji4)
-5994 (keng1)
-5995 (zhong4)
-5996 (yao1)
-5997 (jin4)
-5998 (yun2)
-5999 (miao4)
-599A (pei1)
-599B (chi1)
-599C (yue4)
-599D (zhuang1)
-599E (niu1)
-599F (yan4)
-59A0 (na4)
-59A1 (xin1,xin4)
-59A2 (fen2)
-59A3 (bi3)
-59A4 (yu2)
-59A5 (tuo3)
-59A6 (feng1)
-59A7 (yuan2)
-59A8 (fang2,fang1)
-59A9 (wu3)
-59AA (yu4)
-59AB (gui1)
-59AC (du4)
-59AD (ba2)
-59AE (ni1)
-59AF (zhou2)
-59B0 (zhou2)
-59B1 (zhao1)
-59B2 (da2)
-59B3 (nai3,ni3)
-59B4 (yuan3)
-59B5 (tou3)
-59B6 (xuan2)
-59B7 (zhi2)
-59B8 (e1)
-59B9 (mei4)
-59BA (mo4)
-59BB (qi1,qi4)
-59BC (bi4)
-59BD (shen1)
-59BE (qie4)
-59BF (e1)
-59C0 (he2)
-59C1 (xu3)
-59C2 (fa2)
-59C3 (zheng1)
-59C4 (ni1)
-59C5 (ban4)
-59C6 (mu3)
-59C7 (fu1,fu4)
-59C8 (ling2)
-59C9 (zi3)
-59CA (zi3)
-59CB (shi3)
-59CC (ran3)
-59CD (shan1)
-59CE (yang1)
-59CF (qian2)
-59D0 (jie3)
-59D1 (gu1)
-59D2 (si4)
-59D3 (xing4)
-59D4 (wei3,wei1)
-59D5 (zi1)
-59D6 (ju4)
-59D7 (shan1)
-59D8 (pin1)
-59D9 (ren4)
-59DA (yao2)
-59DB (tong3)
-59DC (jiang1)
-59DD (shu1)
-59DE (ji2)
-59DF (gai1)
-59E0 (shang4)
-59E1 (kuo4)
-59E2 (juan1)
-59E3 (jiao1)
-59E4 (gou4)
-59E5 (lao3,mu3)
-59E6 (jian1)
-59E7 (jian1)
-59E8 (yi2)
-59E9 (nian2)
-59EA (zhi2)
-59EB (ji1)
-59EC (ji1)
-59ED (xian4)
-59EE (heng2)
-59EF (guang1)
-59F0 (jun1)
-59F1 (kua1)
-59F2 (yan4)
-59F3 (ming3)
-59F4 (lie4)
-59F5 (pei4)
-59F6 (yan3)
-59F7 (you4)
-59F8 (yan2)
-59F9 (cha4)
-59FA (xian3)
-59FB (yin1)
-59FC (chi3)
-59FD (gui3)
-59FE (quan2)
-59FF (zi1)
-5A00 (song1)
-5A01 (wei1)
-5A02 (hong2)
-5A03 (wa2)
-5A04 (lou2)
-5A05 (ya4)
-5A06 (rao3,rao2)
-5A07 (jiao1)
-5A08 (luan2)
-5A09 (ping1)
-5A0A (xian4)
-5A0B (shao4)
-5A0C (li3)
-5A0D (cheng2)
-5A0E (xie4)
-5A0F (mang2)
-5A10 (none0)
-5A11 (suo1)
-5A12 (mu3)
-5A13 (wei3)
-5A14 (ke4)
-5A15 (lai4)
-5A16 (chuo4)
-5A17 (ding4)
-5A18 (niang2)
-5A19 (keng1)
-5A1A (nan2)
-5A1B (yu2)
-5A1C (na4,nuo2)
-5A1D (pei1)
-5A1E (sui1)
-5A1F (juan1)
-5A20 (shen1,chen2,zhen4)
-5A21 (zhi4)
-5A22 (han2)
-5A23 (di4)
-5A24 (zhuang1)
-5A25 (e2)
-5A26 (pin2)
-5A27 (tui4)
-5A28 (xian4)
-5A29 (mian3,wan3)
-5A2A (wu2)
-5A2B (yan2)
-5A2C (wu3)
-5A2D (xi1)
-5A2E (yan2)
-5A2F (yu2)
-5A30 (si4)
-5A31 (yu2)
-5A32 (wa1)
-5A33 (li4)
-5A34 (xian2)
-5A35 (ju1)
-5A36 (qu3,qu4)
-5A37 (chui2)
-5A38 (qi1)
-5A39 (xian2)
-5A3A (zhui1)
-5A3B (dong1)
-5A3C (chang1)
-5A3D (lu4)
-5A3E (ai2)
-5A3F (e1)
-5A40 (e1)
-5A41 (lou2,lu:3)
-5A42 (mian2)
-5A43 (cong2)
-5A44 (pou3)
-5A45 (ju2)
-5A46 (po2)
-5A47 (cai3)
-5A48 (ling2)
-5A49 (wan3)
-5A4A (biao3)
-5A4B (xiao1)
-5A4C (shu3)
-5A4D (qi3)
-5A4E (hui1)
-5A4F (fu4)
-5A50 (wo3)
-5A51 (rui2)
-5A52 (tan2)
-5A53 (fei1)
-5A54 (none0)
-5A55 (jie2)
-5A56 (tian1)
-5A57 (ni2)
-5A58 (quan2)
-5A59 (jing4)
-5A5A (hun1)
-5A5B (jing1)
-5A5C (qian1)
-5A5D (dian4)
-5A5E (xing4)
-5A5F (hu4)
-5A60 (wan2)
-5A61 (lai2)
-5A62 (bi4)
-5A63 (yin1)
-5A64 (chou1,zhou1)
-5A65 (chuo4)
-5A66 (fu4)
-5A67 (jing4)
-5A68 (lun2)
-5A69 (yan4,an4)
-5A6A (lan2)
-5A6B (kun1)
-5A6C (yin2)
-5A6D (ya4)
-5A6E (none0)
-5A6F (li4)
-5A70 (dian3)
-5A71 (xian2)
-5A72 (none0)
-5A73 (hua4)
-5A74 (ying1)
-5A75 (chan2)
-5A76 (shen3)
-5A77 (ting2)
-5A78 (yang2)
-5A79 (yao3)
-5A7A (wu4)
-5A7B (nan4)
-5A7C (chuo4)
-5A7D (jia3)
-5A7E (tou1)
-5A7F (xu4)
-5A80 (yu2)
-5A81 (wei1)
-5A82 (ti2)
-5A83 (rou2)
-5A84 (mei3)
-5A85 (dan1)
-5A86 (ruan3)
-5A87 (qin1)
-5A88 (none0)
-5A89 (wu1)
-5A8A (qian2)
-5A8B (chun1)
-5A8C (mao2)
-5A8D (fu4)
-5A8E (jie3)
-5A8F (duan1)
-5A90 (xi1)
-5A91 (zhong4)
-5A92 (mei2)
-5A93 (huang2)
-5A94 (mian2)
-5A95 (an1)
-5A96 (ying2)
-5A97 (xuan1)
-5A98 (none0)
-5A99 (wei1)
-5A9A (mei4)
-5A9B (yuan2,yuan4)
-5A9C (zhen1)
-5A9D (qiu1)
-5A9E (ti2,shi4)
-5A9F (xie4)
-5AA0 (tuo3)
-5AA1 (lian4)
-5AA2 (mao4)
-5AA3 (ran3)
-5AA4 (si1)
-5AA5 (pian1)
-5AA6 (wei4)
-5AA7 (wa1)
-5AA8 (jiu4)
-5AA9 (hu2)
-5AAA (ao3)
-5AAB (none0)
-5AAC (bao3)
-5AAD (xu1)
-5AAE (tou1,tou3)
-5AAF (gui1)
-5AB0 (zou1)
-5AB1 (yao2)
-5AB2 (pi4)
-5AB3 (xi2)
-5AB4 (yuan2)
-5AB5 (ying4)
-5AB6 (rong2)
-5AB7 (ru4)
-5AB8 (chi1)
-5AB9 (liu2)
-5ABA (mei3)
-5ABB (pan2)
-5ABC (ao3)
-5ABD (ma1)
-5ABE (gou4)
-5ABF (kui4)
-5AC0 (qin2)
-5AC1 (jia4)
-5AC2 (sao3)
-5AC3 (zhen1)
-5AC4 (yuan2)
-5AC5 (cha1)
-5AC6 (yong2)
-5AC7 (ming2)
-5AC8 (ying1)
-5AC9 (ji2)
-5ACA (su4)
-5ACB (niao3)
-5ACC (xian2)
-5ACD (tao1,yao3)
-5ACE (pang2)
-5ACF (lang2)
-5AD0 (niao3)
-5AD1 (bao2)
-5AD2 (ai4)
-5AD3 (pi4)
-5AD4 (pin2)
-5AD5 (yi4)
-5AD6 (piao2)
-5AD7 (yu4)
-5AD8 (lei2)
-5AD9 (xuan2)
-5ADA (man4,man1)
-5ADB (yi1)
-5ADC (zhang1)
-5ADD (kang1)
-5ADE (yong2)
-5ADF (ni4)
-5AE0 (li2)
-5AE1 (di2)
-5AE2 (gui1)
-5AE3 (yan1)
-5AE4 (jin4)
-5AE5 (zhuan1)
-5AE6 (chang2)
-5AE7 (ce4)
-5AE8 (han1,ran3)
-5AE9 (nen4)
-5AEA (lao4)
-5AEB (mo2)
-5AEC (zhe1)
-5AED (hu4)
-5AEE (hu4)
-5AEF (ao4)
-5AF0 (nen4)
-5AF1 (qiang2)
-5AF2 (none0)
-5AF3 (bi4)
-5AF4 (gu1)
-5AF5 (wu3)
-5AF6 (qiao2)
-5AF7 (tuo3)
-5AF8 (zhan3)
-5AF9 (mao2)
-5AFA (xian2)
-5AFB (xian2)
-5AFC (mo4)
-5AFD (liao2)
-5AFE (lian2)
-5AFF (hua4)
-5B00 (gui1)
-5B01 (deng1)
-5B02 (zhi2)
-5B03 (xu1)
-5B04 (none0)
-5B05 (hua4)
-5B06 (xi1)
-5B07 (hui4)
-5B08 (rao3,rao2)
-5B09 (xi1)
-5B0A (yan4)
-5B0B (chan2)
-5B0C (jiao1)
-5B0D (mei3)
-5B0E (fan4)
-5B0F (fan1)
-5B10 (xian1)
-5B11 (yi4)
-5B12 (wei4)
-5B13 (chan1)
-5B14 (fan4)
-5B15 (shi4)
-5B16 (bi4)
-5B17 (shan4)
-5B18 (sui4)
-5B19 (qiang2)
-5B1A (lian2)
-5B1B (huan2,qiong2,xuan1)
-5B1C (none0)
-5B1D (niao3)
-5B1E (dong3)
-5B1F (yi4)
-5B20 (can2)
-5B21 (ai4)
-5B22 (niang2)
-5B23 (ning2)
-5B24 (ma1)
-5B25 (tiao3)
-5B26 (chou2)
-5B27 (jin4)
-5B28 (ci2)
-5B29 (yu2)
-5B2A (pin2)
-5B2B (none0)
-5B2C (xu1)
-5B2D (nai3)
-5B2E (yan1)
-5B2F (tai2)
-5B30 (ying1)
-5B31 (can2)
-5B32 (niao3)
-5B33 (none0)
-5B34 (ying2)
-5B35 (mian2)
-5B36 (none0)
-5B37 (ma1)
-5B38 (shen3)
-5B39 (xing4)
-5B3A (ni4)
-5B3B (du2)
-5B3C (liu2)
-5B3D (yuan1)
-5B3E (lan3)
-5B3F (yan4)
-5B40 (shuang1)
-5B41 (ling2)
-5B42 (jiao3)
-5B43 (niang2)
-5B44 (lan3)
-5B45 (xian1)
-5B46 (ying1)
-5B47 (shuang1)
-5B48 (shuai1)
-5B49 (quan2)
-5B4A (mi3)
-5B4B (li2)
-5B4C (luan2)
-5B4D (yan2)
-5B4E (zhu3)
-5B4F (lan3)
-5B50 (zi5,zi3,zi2)
-5B51 (jie2)
-5B52 (jue2)
-5B53 (jue2)
-5B54 (kong3)
-5B55 (yun4)
-5B56 (zi1)
-5B57 (zi4)
-5B58 (cun2)
-5B59 (sun1)
-5B5A (fu2)
-5B5B (bei4,bo2)
-5B5C (zi1)
-5B5D (xiao4)
-5B5E (xin4)
-5B5F (meng4)
-5B60 (si4)
-5B61 (tai1)
-5B62 (bao1)
-5B63 (ji4)
-5B64 (gu1)
-5B65 (nu2)
-5B66 (xue2)
-5B67 (none0)
-5B68 (chan2)
-5B69 (hai2)
-5B6A (luan2)
-5B6B (sun1)
-5B6C (nao1)
-5B6D (mie1)
-5B6E (cong2)
-5B6F (jian1)
-5B70 (shu2)
-5B71 (chan2,can4)
-5B72 (ya1)
-5B73 (zi1,zi4)
-5B74 (ni3)
-5B75 (fu1)
-5B76 (zi1)
-5B77 (li2)
-5B78 (xue2,xiao2)
-5B79 (bo4)
-5B7A (ru2,ru4)
-5B7B (nai2)
-5B7C (nie4)
-5B7D (nie4)
-5B7E (ying1)
-5B7F (luan2)
-5B80 (mian2)
-5B81 (ning2,ning4)
-5B82 (rong3)
-5B83 (ta1)
-5B84 (gui3)
-5B85 (zhai2,zhe4)
-5B86 (qiong2)
-5B87 (yu3)
-5B88 (shou3)
-5B89 (an1)
-5B8A (tu1)
-5B8B (song4)
-5B8C (wan2)
-5B8D (rou4)
-5B8E (yao3)
-5B8F (hong2)
-5B90 (yi2)
-5B91 (jing3)
-5B92 (zhun1)
-5B93 (mi4)
-5B94 (guai1)
-5B95 (dang4)
-5B96 (hong2)
-5B97 (zong1)
-5B98 (guan1)
-5B99 (zhou4)
-5B9A (ding4)
-5B9B (wan3,yuan1)
-5B9C (yi2)
-5B9D (bao3)
-5B9E (shi2)
-5B9F (shi2)
-5BA0 (chong3)
-5BA1 (shen3)
-5BA2 (ke4)
-5BA3 (xuan1)
-5BA4 (shi4)
-5BA5 (you4)
-5BA6 (huan4)
-5BA7 (yi2)
-5BA8 (tiao3)
-5BA9 (shi3)
-5BAA (xian4)
-5BAB (gong1)
-5BAC (cheng2)
-5BAD (qun2)
-5BAE (gong1)
-5BAF (xiao1)
-5BB0 (zai3)
-5BB1 (zha1)
-5BB2 (bao3)
-5BB3 (hai4)
-5BB4 (yan4)
-5BB5 (xiao1)
-5BB6 (jia1,gu1,jie5,jia5)
-5BB7 (shen3)
-5BB8 (chen2)
-5BB9 (rong2)
-5BBA (huang3)
-5BBB (mi4)
-5BBC (kou4)
-5BBD (kuan1)
-5BBE (bin1)
-5BBF (su4,xiu3,xiu4)
-5BC0 (cai3,shen3)
-5BC1 (zan3)
-5BC2 (ji4,ji2)
-5BC3 (yuan1)
-5BC4 (ji4)
-5BC5 (yin2)
-5BC6 (mi4)
-5BC7 (kou4)
-5BC8 (qing1)
-5BC9 (he4)
-5BCA (zhen1)
-5BCB (jian3)
-5BCC (fu4)
-5BCD (ning2)
-5BCE (bing4)
-5BCF (huan2)
-5BD0 (mei4)
-5BD1 (qin3)
-5BD2 (han2)
-5BD3 (yu4)
-5BD4 (shi2)
-5BD5 (ning2)
-5BD6 (jin4)
-5BD7 (ning2)
-5BD8 (zhi4)
-5BD9 (yu3)
-5BDA (bao3)
-5BDB (kuan1)
-5BDC (ning2)
-5BDD (qin3)
-5BDE (mo4)
-5BDF (cha2)
-5BE0 (ju4)
-5BE1 (gua3)
-5BE2 (qin3)
-5BE3 (hu1)
-5BE4 (wu4)
-5BE5 (liao2)
-5BE6 (shi2)
-5BE7 (ning2,ning4)
-5BE8 (zhai4)
-5BE9 (shen3)
-5BEA (wei3)
-5BEB (xie3)
-5BEC (kuan1)
-5BED (hui4)
-5BEE (liao2)
-5BEF (jun4)
-5BF0 (huan2)
-5BF1 (yi4)
-5BF2 (yi2)
-5BF3 (bao3)
-5BF4 (qin1)
-5BF5 (chong3)
-5BF6 (bao3)
-5BF7 (feng1)
-5BF8 (cun4)
-5BF9 (dui4)
-5BFA (si4)
-5BFB (xun2,xin2)
-5BFC (dao3)
-5BFD (lu:3,luo1)
-5BFE (dui4)
-5BFF (shou4)
-5C00 (po3)
-5C01 (feng1)
-5C02 (zhuan1)
-5C03 (fu1)
-5C04 (she4,shi2,ye4)
-5C05 (ke4)
-5C06 (jiang1,jiang4,qiang1)
-5C07 (jiang1,jiang4,qiang1)
-5C08 (zhuan1)
-5C09 (wei4,yu4)
-5C0A (zun1)
-5C0B (xun2,xin2)
-5C0C (shu4)
-5C0D (dui4)
-5C0E (dao3,dao4)
-5C0F (xiao3)
-5C10 (ji1)
-5C11 (shao3,shao4)
-5C12 (er3)
-5C13 (er3)
-5C14 (er3)
-5C15 (ga3)
-5C16 (jian1)
-5C17 (shu1)
-5C18 (chen2)
-5C19 (shang4)
-5C1A (shang4)
-5C1B (yuan2)
-5C1C (ga2)
-5C1D (chang2)
-5C1E (liao2,liao3)
-5C1F (xian3)
-5C20 (xian1)
-5C21 (none0)
-5C22 (wang1,you2)
-5C23 (wang1,you2)
-5C24 (you2)
-5C25 (liao4)
-5C26 (liao4)
-5C27 (yao2)
-5C28 (mang2,pang2)
-5C29 (wang1)
-5C2A (wang1)
-5C2B (wang1)
-5C2C (ga4)
-5C2D (yao2)
-5C2E (duo4)
-5C2F (kui4)
-5C30 (zhong3,zhong4)
-5C31 (jiu4)
-5C32 (gan1)
-5C33 (gu3)
-5C34 (gan1)
-5C35 (gan1)
-5C36 (gan1)
-5C37 (gan1)
-5C38 (shi1)
-5C39 (yin3)
-5C3A (chi3,che3)
-5C3B (kao1)
-5C3C (ni2)
-5C3D (jin3,jin4)
-5C3E (wei3,yi3)
-5C3F (niao4,sui1,ni4)
-5C40 (ju2)
-5C41 (pi4)
-5C42 (ceng2)
-5C43 (xi4)
-5C44 (bi1,bi3)
-5C45 (ju1,ji1)
-5C46 (jie4)
-5C47 (tian1)
-5C48 (qu1)
-5C49 (ti4)
-5C4A (jie4)
-5C4B (wu1)
-5C4C (diao3)
-5C4D (shi1)
-5C4E (shi3)
-5C4F (ping2,bing3)
-5C50 (ji1)
-5C51 (xie4)
-5C52 (chen2)
-5C53 (xi4)
-5C54 (ni2)
-5C55 (zhan3)
-5C56 (xi1)
-5C57 (none0)
-5C58 (man3)
-5C59 (e1)
-5C5A (lou4)
-5C5B (ping2)
-5C5C (ti4)
-5C5D (fei4)
-5C5E (shu3,zhu3)
-5C5F (xie4)
-5C60 (tu2)
-5C61 (lu:3)
-5C62 (lu:3)
-5C63 (xi3)
-5C64 (ceng2)
-5C65 (lu:3)
-5C66 (ju4)
-5C67 (xie4)
-5C68 (ju4)
-5C69 (jue2)
-5C6A (liao2)
-5C6B (jue2)
-5C6C (shu3,zhu3)
-5C6D (xi4)
-5C6E (che4)
-5C6F (tun2,zhun1)
-5C70 (ni4)
-5C71 (shan1)
-5C72 (wa1)
-5C73 (xian1)
-5C74 (li4)
-5C75 (e4)
-5C76 (none0)
-5C77 (none0)
-5C78 (long2)
-5C79 (yi4,ge1)
-5C7A (qi3)
-5C7B (ren4)
-5C7C (wu4)
-5C7D (han4)
-5C7E (shen1)
-5C7F (yu3)
-5C80 (chu1)
-5C81 (sui4)
-5C82 (qi3)
-5C83 (none0)
-5C84 (yue4)
-5C85 (ban3)
-5C86 (yao3)
-5C87 (ang2)
-5C88 (ya2)
-5C89 (wu4)
-5C8A (jie2)
-5C8B (e4)
-5C8C (ji2)
-5C8D (qian1)
-5C8E (fen1)
-5C8F (wan2)
-5C90 (qi2)
-5C91 (cen2)
-5C92 (qian2)
-5C93 (qi2)
-5C94 (cha4)
-5C95 (jie4)
-5C96 (qu1)
-5C97 (gang3,gang1)
-5C98 (xian4)
-5C99 (ao4)
-5C9A (lan2)
-5C9B (dao3)
-5C9C (ba1)
-5C9D (zhai3)
-5C9E (zuo4)
-5C9F (yang3)
-5CA0 (ju4)
-5CA1 (gang1)
-5CA2 (ke3)
-5CA3 (gou3)
-5CA4 (xue4)
-5CA5 (bo1)
-5CA6 (li4)
-5CA7 (tiao2)
-5CA8 (qu1)
-5CA9 (yan2)
-5CAA (fu2)
-5CAB (xiu4)
-5CAC (jia3)
-5CAD (ling3)
-5CAE (tuo2)
-5CAF (pei1)
-5CB0 (you3)
-5CB1 (dai4)
-5CB2 (kuang4)
-5CB3 (yue4)
-5CB4 (qu1)
-5CB5 (hu4)
-5CB6 (po4)
-5CB7 (min2)
-5CB8 (an4)
-5CB9 (tiao2)
-5CBA (ling3)
-5CBB (chi2)
-5CBC (none0)
-5CBD (dong1)
-5CBE (none0)
-5CBF (kui1)
-5CC0 (xiu4)
-5CC1 (mao3)
-5CC2 (tong2)
-5CC3 (xue2)
-5CC4 (yi4)
-5CC5 (none0)
-5CC6 (he1)
-5CC7 (ke1)
-5CC8 (luo4)
-5CC9 (e1)
-5CCA (fu4)
-5CCB (xun2)
-5CCC (die2)
-5CCD (lu4)
-5CCE (lang3)
-5CCF (er3)
-5CD0 (gai1)
-5CD1 (quan2)
-5CD2 (tong2,dong4)
-5CD3 (yi2)
-5CD4 (mu3)
-5CD5 (shi2)
-5CD6 (an1)
-5CD7 (wei3)
-5CD8 (hu1)
-5CD9 (zhi4,shi4)
-5CDA (mi4)
-5CDB (li3)
-5CDC (ji1)
-5CDD (tong2)
-5CDE (kui3)
-5CDF (you4)
-5CE0 (none0)
-5CE1 (xia2)
-5CE2 (li3)
-5CE3 (yao2)
-5CE4 (jiao4,qiao2,jiao2)
-5CE5 (zheng1)
-5CE6 (luan2)
-5CE7 (jiao1)
-5CE8 (e2)
-5CE9 (e2)
-5CEA (yu4)
-5CEB (ye2)
-5CEC (bu1)
-5CED (qiao4)
-5CEE (qun1)
-5CEF (feng1)
-5CF0 (feng1)
-5CF1 (nao2,nao1)
-5CF2 (li4)
-5CF3 (you2)
-5CF4 (xian4)
-5CF5 (hong2)
-5CF6 (dao3)
-5CF7 (shen1)
-5CF8 (cheng2)
-5CF9 (tu2)
-5CFA (geng3)
-5CFB (jun4)
-5CFC (hao4)
-5CFD (xia2)
-5CFE (yin1)
-5CFF (wu2,yu1)
-5D00 (lang4)
-5D01 (kan3)
-5D02 (lao2)
-5D03 (lai2)
-5D04 (xian3)
-5D05 (que4)
-5D06 (kong1)
-5D07 (chong2)
-5D08 (chong2)
-5D09 (ta4)
-5D0A (none0)
-5D0B (hua2,hua4)
-5D0C (ju1)
-5D0D (lai2)
-5D0E (qi2)
-5D0F (min2)
-5D10 (kun1)
-5D11 (kun1)
-5D12 (zu2)
-5D13 (gu4)
-5D14 (cui1)
-5D15 (ya2)
-5D16 (ya2,ai2)
-5D17 (gang3,gang1)
-5D18 (lun2)
-5D19 (lun2)
-5D1A (leng2)
-5D1B (jue2)
-5D1C (duo1)
-5D1D (cheng1)
-5D1E (guo1)
-5D1F (yin2)
-5D20 (dong1)
-5D21 (han2)
-5D22 (zheng1)
-5D23 (wei3)
-5D24 (yao2,xiao2)
-5D25 (pi3)
-5D26 (yan1)
-5D27 (song1)
-5D28 (jie2)
-5D29 (beng1)
-5D2A (zu2)
-5D2B (jue2)
-5D2C (dong1)
-5D2D (zhan3)
-5D2E (gu4)
-5D2F (yin2)
-5D30 (zi1)
-5D31 (ze2)
-5D32 (huang2)
-5D33 (yu2)
-5D34 (wei1,wai3)
-5D35 (yang2)
-5D36 (feng1)
-5D37 (qiu2)
-5D38 (dun4)
-5D39 (ti2)
-5D3A (yi3)
-5D3B (zhi4)
-5D3C (shi4)
-5D3D (zai3)
-5D3E (yao3)
-5D3F (e4)
-5D40 (zhu4)
-5D41 (kan1)
-5D42 (lu:4)
-5D43 (yan3)
-5D44 (mei3)
-5D45 (gan1,gan4)
-5D46 (ji1)
-5D47 (ji1)
-5D48 (huan4)
-5D49 (ting2)
-5D4A (sheng4)
-5D4B (mei2)
-5D4C (qian4,qian1,kan4)
-5D4D (wu4)
-5D4E (yu2)
-5D4F (zong1)
-5D50 (lan2)
-5D51 (jie2,he2)
-5D52 (yan2)
-5D53 (yan2)
-5D54 (wei3)
-5D55 (zong1)
-5D56 (cha2)
-5D57 (sui4)
-5D58 (rong2)
-5D59 (ke1)
-5D5A (qin1)
-5D5B (yu2)
-5D5C (qi2)
-5D5D (lou3)
-5D5E (tu2)
-5D5F (dui1)
-5D60 (xi1)
-5D61 (weng1)
-5D62 (cang1)
-5D63 (dang1)
-5D64 (rong2)
-5D65 (jie2)
-5D66 (ai2)
-5D67 (liu2)
-5D68 (wu3)
-5D69 (song1)
-5D6A (qiao1)
-5D6B (zi1)
-5D6C (wei2)
-5D6D (beng1)
-5D6E (dian1)
-5D6F (cuo2)
-5D70 (qian3)
-5D71 (yong2)
-5D72 (nie4)
-5D73 (cuo2)
-5D74 (ji2)
-5D75 (none0)
-5D76 (none0)
-5D77 (song3)
-5D78 (zong1)
-5D79 (jiang4)
-5D7A (liao2)
-5D7B (none0)
-5D7C (chan3)
-5D7D (di4)
-5D7E (cen1)
-5D7F (ding3)
-5D80 (tu1,die2)
-5D81 (lou3)
-5D82 (zhang4)
-5D83 (zhan3)
-5D84 (zhan3)
-5D85 (ao2)
-5D86 (cao2)
-5D87 (qu1)
-5D88 (qiang1)
-5D89 (zui1)
-5D8A (zui3)
-5D8B (dao3)
-5D8C (dao3)
-5D8D (xi2)
-5D8E (yu4)
-5D8F (bo2)
-5D90 (long2)
-5D91 (xiang3)
-5D92 (ceng2)
-5D93 (bo1)
-5D94 (qin1)
-5D95 (jiao1)
-5D96 (yan3)
-5D97 (lao2)
-5D98 (zhan4)
-5D99 (lin2)
-5D9A (liao2)
-5D9B (liao2)
-5D9C (jin1)
-5D9D (deng4)
-5D9E (duo4)
-5D9F (zun1)
-5DA0 (jiao4,qiao2)
-5DA1 (gui4)
-5DA2 (yao2)
-5DA3 (qiao2)
-5DA4 (yao2)
-5DA5 (jue2)
-5DA6 (zhan1)
-5DA7 (yi4)
-5DA8 (xue1)
-5DA9 (nao2)
-5DAA (ye4)
-5DAB (ye4)
-5DAC (yi1)
-5DAD (e4)
-5DAE (xian3)
-5DAF (ji2)
-5DB0 (xie4)
-5DB1 (ke3)
-5DB2 (sui3)
-5DB3 (di4)
-5DB4 (ao4)
-5DB5 (zui4)
-5DB6 (none0)
-5DB7 (yi2)
-5DB8 (rong2)
-5DB9 (dao3)
-5DBA (ling3)
-5DBB (za2)
-5DBC (yu3)
-5DBD (yue4)
-5DBE (yin3)
-5DBF (none0)
-5DC0 (jie2)
-5DC1 (li4)
-5DC2 (sui3,xi1)
-5DC3 (long2)
-5DC4 (long2)
-5DC5 (dian1)
-5DC6 (ying2)
-5DC7 (xi1)
-5DC8 (ju2)
-5DC9 (chan2)
-5DCA (ying3)
-5DCB (kui1)
-5DCC (yan2)
-5DCD (wei1,wei2)
-5DCE (nao2)
-5DCF (quan2)
-5DD0 (chao1)
-5DD1 (cuan2)
-5DD2 (luan2)
-5DD3 (dian1)
-5DD4 (dian1)
-5DD5 (nie4)
-5DD6 (yan2)
-5DD7 (yan2)
-5DD8 (yan3)
-5DD9 (nao2)
-5DDA (yan3)
-5DDB (chuan1)
-5DDC (gui4)
-5DDD (chuan1)
-5DDE (zhou1)
-5DDF (huang1)
-5DE0 (jing1)
-5DE1 (xun2)
-5DE2 (chao2)
-5DE3 (chao2)
-5DE4 (lie4)
-5DE5 (gong1)
-5DE6 (zuo3)
-5DE7 (qiao3)
-5DE8 (ju4)
-5DE9 (gong3)
-5DEA (none0)
-5DEB (wu1,wu2)
-5DEC (none0)
-5DED (none0)
-5DEE (cha1,cha4,chai1,ci1)
-5DEF (qiu2)
-5DF0 (qiu2)
-5DF1 (ji3)
-5DF2 (yi3)
-5DF3 (si4)
-5DF4 (ba1)
-5DF5 (zhi1)
-5DF6 (zhao1)
-5DF7 (xiang4,hang4)
-5DF8 (yi2)
-5DF9 (jin3)
-5DFA (xun4)
-5DFB (juan4,juan3)
-5DFC (none0)
-5DFD (xun4)
-5DFE (jin1)
-5DFF (fu2)
-5E00 (za1)
-5E01 (bi4)
-5E02 (shi4)
-5E03 (bu4)
-5E04 (ding1)
-5E05 (shuai4)
-5E06 (fan1,fan2)
-5E07 (nie4)
-5E08 (shi1)
-5E09 (fen1)
-5E0A (pa4)
-5E0B (zhi3)
-5E0C (xi1)
-5E0D (hu4)
-5E0E (dan4)
-5E0F (wei2)
-5E10 (zhang4)
-5E11 (tang3)
-5E12 (dai4)
-5E13 (ma4)
-5E14 (pei4)
-5E15 (pa4)
-5E16 (tie1,tie3,tie4)
-5E17 (fu2)
-5E18 (lian2)
-5E19 (zhi4)
-5E1A (zhou3)
-5E1B (bo2)
-5E1C (zhi4)
-5E1D (di4)
-5E1E (mo4)
-5E1F (yi4)
-5E20 (yi4)
-5E21 (ping2)
-5E22 (qia4)
-5E23 (juan4)
-5E24 (ru2)
-5E25 (shuai4,shuo4)
-5E26 (dai4)
-5E27 (zhen1)
-5E28 (shui4)
-5E29 (qiao4)
-5E2A (zhen1)
-5E2B (shi1)
-5E2C (qun2)
-5E2D (xi2)
-5E2E (bang1)
-5E2F (dai4)
-5E30 (gui1)
-5E31 (chou2,dao4)
-5E32 (ping2)
-5E33 (zhang4)
-5E34 (sha1)
-5E35 (wan1)
-5E36 (dai4)
-5E37 (wei2)
-5E38 (chang2)
-5E39 (sha4)
-5E3A (qi2)
-5E3B (ze2)
-5E3C (guo2)
-5E3D (mao4)
-5E3E (du3)
-5E3F (hou2)
-5E40 (zhen1,zheng4)
-5E41 (xu1)
-5E42 (mi4)
-5E43 (wei2)
-5E44 (wo4)
-5E45 (fu2)
-5E46 (yi4)
-5E47 (bang1)
-5E48 (ping2)
-5E49 (none0)
-5E4A (gong1)
-5E4B (pan2)
-5E4C (huang3)
-5E4D (dao1,tao1)
-5E4E (mi4)
-5E4F (jia1)
-5E50 (teng2)
-5E51 (hui1)
-5E52 (zhong1)
-5E53 (sen1)
-5E54 (man4)
-5E55 (mu4)
-5E56 (biao1)
-5E57 (guo2)
-5E58 (ze2)
-5E59 (mu4)
-5E5A (bang1)
-5E5B (zhang4)
-5E5C (jiong3)
-5E5D (chan3)
-5E5E (fu2)
-5E5F (zhi4)
-5E60 (hu1)
-5E61 (fan1)
-5E62 (chuang2,zhuang4)
-5E63 (bi4)
-5E64 (bi4)
-5E65 (none0)
-5E66 (mi4)
-5E67 (qiao1)
-5E68 (dan4)
-5E69 (fen2)
-5E6A (meng2)
-5E6B (bang1)
-5E6C (chou2,dao4)
-5E6D (mie4)
-5E6E (chu2)
-5E6F (jie1)
-5E70 (xian3)
-5E71 (lan2)
-5E72 (gan1,gan4)
-5E73 (ping2)
-5E74 (nian2)
-5E75 (jian1)
-5E76 (bing4,bing1)
-5E77 (bing4)
-5E78 (xing4)
-5E79 (gan4,gan1)
-5E7A (yao1)
-5E7B (huan4)
-5E7C (you4)
-5E7D (you1)
-5E7E (ji3,ji1)
-5E7F (guang3,an1)
-5E80 (pi3)
-5E81 (ting1)
-5E82 (ze4)
-5E83 (guang3,an1)
-5E84 (zhuang1)
-5E85 (mo5)
-5E86 (qing4)
-5E87 (bi4)
-5E88 (qin2)
-5E89 (dun4)
-5E8A (chuang2)
-5E8B (gui3)
-5E8C (ya3)
-5E8D (bai4)
-5E8E (jie4)
-5E8F (xu4)
-5E90 (lu2)
-5E91 (wu3)
-5E92 (none0)
-5E93 (ku4)
-5E94 (ying1,ying4)
-5E95 (di3,de5)
-5E96 (pao2)
-5E97 (dian4)
-5E98 (ya1)
-5E99 (miao4)
-5E9A (geng1)
-5E9B (ci1)
-5E9C (fu3)
-5E9D (tong2)
-5E9E (pang2)
-5E9F (fei4)
-5EA0 (xiang2)
-5EA1 (yi3)
-5EA2 (zhi4)
-5EA3 (tiao1)
-5EA4 (zhi4)
-5EA5 (xiu1)
-5EA6 (du4,duo2,duo4)
-5EA7 (zuo4)
-5EA8 (xiao1)
-5EA9 (tu2)
-5EAA (gui3)
-5EAB (ku4)
-5EAC (pang2,mang3)
-5EAD (ting2)
-5EAE (you3)
-5EAF (bu1)
-5EB0 (bing3)
-5EB1 (cheng3)
-5EB2 (lai2)
-5EB3 (bi4,bei1)
-5EB4 (ji2)
-5EB5 (an1)
-5EB6 (shu4)
-5EB7 (kang1)
-5EB8 (yong1)
-5EB9 (tuo3)
-5EBA (song1)
-5EBB (shu4)
-5EBC (qing3)
-5EBD (yu4)
-5EBE (yu3)
-5EBF (miao4)
-5EC0 (sou1)
-5EC1 (ce4,ci4)
-5EC2 (xiang1)
-5EC3 (fei4)
-5EC4 (jiu4)
-5EC5 (he2)
-5EC6 (hui4)
-5EC7 (liu4)
-5EC8 (sha4,xia4)
-5EC9 (lian2)
-5ECA (lang2)
-5ECB (sou1)
-5ECC (jian1)
-5ECD (pou3)
-5ECE (qing3)
-5ECF (jiu4)
-5ED0 (jiu4)
-5ED1 (qin2,jin3)
-5ED2 (ao2)
-5ED3 (kuo4)
-5ED4 (lou2)
-5ED5 (yin4)
-5ED6 (liao4)
-5ED7 (dai4)
-5ED8 (lu4)
-5ED9 (yi4)
-5EDA (chu2)
-5EDB (chan2)
-5EDC (tu2)
-5EDD (si1)
-5EDE (xin1)
-5EDF (miao4)
-5EE0 (chang3,an1)
-5EE1 (wu3)
-5EE2 (fei4)
-5EE3 (guang3,an1)
-5EE4 (none0)
-5EE5 (guai4)
-5EE6 (bi4)
-5EE7 (qiang2)
-5EE8 (xie4)
-5EE9 (lin3)
-5EEA (lin3)
-5EEB (liao2)
-5EEC (lu2)
-5EED (none0)
-5EEE (ying2)
-5EEF (xian1)
-5EF0 (ting1)
-5EF1 (yong1)
-5EF2 (li2)
-5EF3 (ting1)
-5EF4 (yin3)
-5EF5 (xun2)
-5EF6 (yan2)
-5EF7 (ting2)
-5EF8 (di2)
-5EF9 (po4)
-5EFA (jian4)
-5EFB (hui2)
-5EFC (nai3)
-5EFD (hui2)
-5EFE (gong3)
-5EFF (nian4)
-5F00 (kai1)
-5F01 (bian4)
-5F02 (yi4)
-5F03 (qi4)
-5F04 (nong4,long4)
-5F05 (fen2)
-5F06 (ju3)
-5F07 (yan3)
-5F08 (yi4)
-5F09 (zang4,zhuang3)
-5F0A (bi4)
-5F0B (yi4)
-5F0C (yi1)
-5F0D (er4)
-5F0E (san1)
-5F0F (shi4)
-5F10 (er4)
-5F11 (shi4)
-5F12 (shi4)
-5F13 (gong1)
-5F14 (diao4)
-5F15 (yin3)
-5F16 (hu4)
-5F17 (fu2)
-5F18 (hong2)
-5F19 (wu1)
-5F1A (tui2)
-5F1B (chi2)
-5F1C (qiang2,qiang3)
-5F1D (ba4)
-5F1E (shen3)
-5F1F (di4)
-5F20 (zhang1)
-5F21 (jue2)
-5F22 (tao1)
-5F23 (fu3)
-5F24 (di3)
-5F25 (mi2)
-5F26 (xian2)
-5F27 (hu2)
-5F28 (chao1)
-5F29 (nu3)
-5F2A (jing4)
-5F2B (zhen3)
-5F2C (yi2)
-5F2D (mi3)
-5F2E (quan1)
-5F2F (wan1)
-5F30 (shao1)
-5F31 (ruo4)
-5F32 (xuan1)
-5F33 (jing4)
-5F34 (diao1)
-5F35 (zhang1)
-5F36 (jiang4)
-5F37 (qiang2,jiang4,qiang3)
-5F38 (beng1)
-5F39 (dan4,tan2)
-5F3A (qiang2,qiang3,jiang4)
-5F3B (bi4)
-5F3C (bi4)
-5F3D (she4)
-5F3E (dan4,tan2)
-5F3F (jian3)
-5F40 (gou4)
-5F41 (none0)
-5F42 (fa1)
-5F43 (bi4)
-5F44 (kou1)
-5F45 (none0)
-5F46 (bie4)
-5F47 (xiao1)
-5F48 (dan4,tan2)
-5F49 (kuang4)
-5F4A (qiang2,jiang4)
-5F4B (hong2)
-5F4C (mi2)
-5F4D (kuo4)
-5F4E (wan1)
-5F4F (jue2)
-5F50 (ji4)
-5F51 (ji4)
-5F52 (gui1)
-5F53 (dang1,dang4)
-5F54 (lu4)
-5F55 (lu4)
-5F56 (tuan4)
-5F57 (hui4)
-5F58 (zhi4)
-5F59 (hui4)
-5F5A (hui4)
-5F5B (yi2)
-5F5C (yi2)
-5F5D (yi2)
-5F5E (yi2)
-5F5F (huo4)
-5F60 (huo4)
-5F61 (shan1)
-5F62 (xing2)
-5F63 (zhang1)
-5F64 (tong2)
-5F65 (yan4)
-5F66 (yan4)
-5F67 (yu4)
-5F68 (chi1)
-5F69 (cai3)
-5F6A (biao1)
-5F6B (diao1)
-5F6C (bin1)
-5F6D (peng2)
-5F6E (yong3)
-5F6F (piao4)
-5F70 (zhang1)
-5F71 (ying3)
-5F72 (chi1)
-5F73 (chi4)
-5F74 (zhuo2)
-5F75 (tuo3)
-5F76 (ji2)
-5F77 (pang2,fang3)
-5F78 (zhong1)
-5F79 (yi4)
-5F7A (wang2)
-5F7B (che4)
-5F7C (bi3)
-5F7D (di1)
-5F7E (ling3)
-5F7F (fu2)
-5F80 (wang3,wang4)
-5F81 (zheng1)
-5F82 (cu2)
-5F83 (wang3,wang4)
-5F84 (jing4)
-5F85 (dai4,dai1)
-5F86 (xi1)
-5F87 (xun4,xun2)
-5F88 (hen3)
-5F89 (yang2)
-5F8A (huai2,hui2)
-5F8B (lu:4)
-5F8C (hou4)
-5F8D (wang3)
-5F8E (cheng3)
-5F8F (zhi4)
-5F90 (xu2)
-5F91 (jing4)
-5F92 (tu2)
-5F93 (cong2)
-5F94 (none0)
-5F95 (lai2)
-5F96 (cong2)
-5F97 (de2,de5,dei3)
-5F98 (pai2)
-5F99 (xi3)
-5F9A (none0)
-5F9B (qi1)
-5F9C (chang2)
-5F9D (zhi4)
-5F9E (cong2,cong1,zong4)
-5F9F (zhou1)
-5FA0 (lai2)
-5FA1 (yu4)
-5FA2 (xie4)
-5FA3 (jie4)
-5FA4 (jian4)
-5FA5 (chi2,shi4)
-5FA6 (jia3)
-5FA7 (bian4)
-5FA8 (huang2)
-5FA9 (fu4)
-5FAA (xun2)
-5FAB (wei3)
-5FAC (pang2)
-5FAD (yao2)
-5FAE (wei1,wei2)
-5FAF (xi1)
-5FB0 (zheng1)
-5FB1 (piao4)
-5FB2 (chi2)
-5FB3 (de2)
-5FB4 (zheng1)
-5FB5 (zhi3,zheng1)
-5FB6 (bie2)
-5FB7 (de2)
-5FB8 (chong1)
-5FB9 (che4)
-5FBA (jiao3)
-5FBB (wei4)
-5FBC (jiao4,jiao3,jia3)
-5FBD (hui1)
-5FBE (mei2)
-5FBF (long4)
-5FC0 (xiang1)
-5FC1 (bao4)
-5FC2 (qu2)
-5FC3 (xin1)
-5FC4 (xin1)
-5FC5 (bi4)
-5FC6 (yi4)
-5FC7 (le4)
-5FC8 (ren2)
-5FC9 (dao1)
-5FCA (ding4)
-5FCB (gai3)
-5FCC (ji4)
-5FCD (ren3)
-5FCE (ren2)
-5FCF (chan4)
-5FD0 (tan3)
-5FD1 (te4)
-5FD2 (te4,tui1,tei1)
-5FD3 (gan1)
-5FD4 (qi4)
-5FD5 (dai4)
-5FD6 (cun3)
-5FD7 (zhi4)
-5FD8 (wang4,wang2)
-5FD9 (mang2)
-5FDA (xi1)
-5FDB (fan2)
-5FDC (ying1,ying4)
-5FDD (tian3)
-5FDE (min2)
-5FDF (min2)
-5FE0 (zhong1)
-5FE1 (chong1)
-5FE2 (wu4)
-5FE3 (ji2)
-5FE4 (wu3)
-5FE5 (xi4)
-5FE6 (ye4)
-5FE7 (you1)
-5FE8 (wan4)
-5FE9 (zong3)
-5FEA (zhong1,song1)
-5FEB (kuai4)
-5FEC (yu4)
-5FED (bian4)
-5FEE (zhi4)
-5FEF (chi2)
-5FF0 (cui4)
-5FF1 (chen2)
-5FF2 (tai4)
-5FF3 (tun2)
-5FF4 (qian2)
-5FF5 (nian4)
-5FF6 (hun2)
-5FF7 (xiong1)
-5FF8 (niu3,nu:4)
-5FF9 (wang3)
-5FFA (xian1)
-5FFB (xin1)
-5FFC (kang1)
-5FFD (hu1)
-5FFE (kai4)
-5FFF (fen4)
-6000 (huai2)
-6001 (tai4)
-6002 (song3)
-6003 (wu3)
-6004 (ou4)
-6005 (chang4)
-6006 (chuang4)
-6007 (ju4)
-6008 (yi4)
-6009 (bao3)
-600A (chao1)
-600B (min2)
-600C (pi1)
-600D (zuo4)
-600E (zen3,ze3)
-600F (yang4)
-6010 (kou4)
-6011 (ban4)
-6012 (nu4)
-6013 (nao2)
-6014 (zheng1,zheng4)
-6015 (pa4)
-6016 (bu4)
-6017 (tie1)
-6018 (hu4)
-6019 (hu4)
-601A (ju4)
-601B (da2)
-601C (lian2,ling2)
-601D (si1,sai1)
-601E (zhou4)
-601F (di4)
-6020 (dai4)
-6021 (yi2)
-6022 (tu2)
-6023 (you2)
-6024 (fu1)
-6025 (ji2)
-6026 (peng1)
-6027 (xing4)
-6028 (yuan4)
-6029 (ni2)
-602A (guai4)
-602B (fu2,fei4)
-602C (xi4)
-602D (bi4)
-602E (you1)
-602F (qie4,que4)
-6030 (xuan4)
-6031 (zong1)
-6032 (bing3)
-6033 (huang3)
-6034 (xu4)
-6035 (chu4)
-6036 (pi1)
-6037 (xi1)
-6038 (xi1)
-6039 (tan1)
-603A (none0)
-603B (zong3)
-603C (dui4)
-603D (none0)
-603E (none0)
-603F (yi4)
-6040 (chi3)
-6041 (nen4,ren4,nin2)
-6042 (xun2)
-6043 (shi4)
-6044 (xi4)
-6045 (lao3)
-6046 (heng2)
-6047 (kuang1)
-6048 (mou2,mu4)
-6049 (zhi3)
-604A (xie2)
-604B (lian4)
-604C (tiao1)
-604D (huang3)
-604E (die2)
-604F (hao3)
-6050 (kong3)
-6051 (gui3)
-6052 (heng2)
-6053 (xi1)
-6054 (xiao4)
-6055 (shu4)
-6056 (sai1,si1)
-6057 (hu1)
-6058 (qiu1)
-6059 (yang4)
-605A (hui4)
-605B (hui2)
-605C (chi4)
-605D (jia2)
-605E (yi2)
-605F (xiong1)
-6060 (guai4)
-6061 (lin4)
-6062 (hui1)
-6063 (zi4)
-6064 (xu4)
-6065 (chi3)
-6066 (xiang4)
-6067 (nu:4)
-6068 (hen4)
-6069 (en1)
-606A (ke4,que4)
-606B (dong4,tong1)
-606C (tian2)
-606D (gong1)
-606E (quan2)
-606F (xi1,xi2)
-6070 (qia4)
-6071 (yue4)
-6072 (peng1)
-6073 (ken3)
-6074 (de2)
-6075 (hui4)
-6076 (e4,e3,wu4,wu1)
-6077 (none0)
-6078 (tong4)
-6079 (yan1)
-607A (kai3)
-607B (ce4)
-607C (nao3)
-607D (yun4)
-607E (mang2)
-607F (yong3)
-6080 (yong3)
-6081 (juan4)
-6082 (mang2)
-6083 (kun3)
-6084 (qiao3,qiao1)
-6085 (yue4)
-6086 (yu4)
-6087 (yu4)
-6088 (jie4)
-6089 (xi1)
-608A (zhe2,qi1)
-608B (lin4)
-608C (ti4)
-608D (han4)
-608E (hao4)
-608F (qie4)
-6090 (ti4)
-6091 (bu4)
-6092 (yi4)
-6093 (qian4)
-6094 (hui3)
-6095 (xi1)
-6096 (bei4)
-6097 (man2)
-6098 (yi2)
-6099 (heng1)
-609A (song3)
-609B (quan1)
-609C (cheng3)
-609D (kui1,li3)
-609E (wu4)
-609F (wu4)
-60A0 (you1)
-60A1 (li2)
-60A2 (liang4)
-60A3 (huan4)
-60A4 (cong1)
-60A5 (yi4)
-60A6 (yue4)
-60A7 (li4)
-60A8 (nin2)
-60A9 (nao3)
-60AA (e4,e3,wu4)
-60AB (que4)
-60AC (xuan2)
-60AD (qian1)
-60AE (wu4)
-60AF (min3)
-60B0 (cong2)
-60B1 (fei3)
-60B2 (bei1)
-60B3 (de2)
-60B4 (cui4)
-60B5 (chang4)
-60B6 (men4,men1)
-60B7 (li4)
-60B8 (ji4)
-60B9 (guan4)
-60BA (guan4)
-60BB (xing4)
-60BC (dao4)
-60BD (qi1)
-60BE (kong1)
-60BF (tian3)
-60C0 (lun2)
-60C1 (xi1)
-60C2 (kan3)
-60C3 (kun1)
-60C4 (ni4)
-60C5 (qing2,qing5)
-60C6 (chou2)
-60C7 (dun1)
-60C8 (guo3)
-60C9 (chan1)
-60CA (jing1)
-60CB (wan3)
-60CC (yuan1)
-60CD (jin1)
-60CE (ji4)
-60CF (lin2)
-60D0 (yu4)
-60D1 (huo4)
-60D2 (he2)
-60D3 (quan1)
-60D4 (yan3)
-60D5 (ti4)
-60D6 (ti4)
-60D7 (nie1)
-60D8 (wang3)
-60D9 (chuo4)
-60DA (hu1)
-60DB (hun1)
-60DC (xi1,xi2)
-60DD (chang3)
-60DE (xin1)
-60DF (wei2)
-60E0 (hui4)
-60E1 (e4,e3,wu4,wu1)
-60E2 (rui3)
-60E3 (zong3)
-60E4 (jian1)
-60E5 (yong3)
-60E6 (dian4)
-60E7 (ju4)
-60E8 (can3,can4)
-60E9 (cheng2)
-60EA (de2)
-60EB (bei4)
-60EC (qie4)
-60ED (can2)
-60EE (dan4)
-60EF (guan4)
-60F0 (duo4)
-60F1 (nao3)
-60F2 (yun4)
-60F3 (xiang3)
-60F4 (zhui4)
-60F5 (die2)
-60F6 (huang2)
-60F7 (chun3)
-60F8 (qiong2)
-60F9 (re3)
-60FA (xing1)
-60FB (ce4)
-60FC (bian3)
-60FD (hun1)
-60FE (zong1)
-60FF (ti2)
-6100 (qiao3)
-6101 (chou2)
-6102 (bei4)
-6103 (xuan1)
-6104 (wei1)
-6105 (ge2)
-6106 (qian1)
-6107 (wei3)
-6108 (yu4)
-6109 (yu2)
-610A (bi4)
-610B (xuan1)
-610C (huan4)
-610D (min3)
-610E (bi4)
-610F (yi4)
-6110 (mian3)
-6111 (yong3)
-6112 (kai4,qi4)
-6113 (dang4)
-6114 (yin1)
-6115 (e4)
-6116 (chen2)
-6117 (mou4)
-6118 (qia4)
-6119 (ke4)
-611A (yu2)
-611B (ai4)
-611C (qie4)
-611D (yan3)
-611E (nuo4)
-611F (gan3)
-6120 (yun4)
-6121 (zong3)
-6122 (sai1)
-6123 (leng4)
-6124 (fen4)
-6125 (none0)
-6126 (kui4)
-6127 (kui4)
-6128 (que4)
-6129 (gong1)
-612A (yun2)
-612B (su4)
-612C (su4)
-612D (qi2)
-612E (yao2)
-612F (song3)
-6130 (huang4)
-6131 (none0)
-6132 (gu3)
-6133 (ju4)
-6134 (chuang4)
-6135 (ta1)
-6136 (xie2)
-6137 (kai3)
-6138 (zheng3)
-6139 (yong3)
-613A (cao3)
-613B (sun4)
-613C (shen4)
-613D (bo2)
-613E (kai4)
-613F (yuan4)
-6140 (xie2)
-6141 (hun4)
-6142 (yong3)
-6143 (yang3)
-6144 (li4)
-6145 (sao1)
-6146 (tao1)
-6147 (yin1)
-6148 (ci2)
-6149 (xu4)
-614A (qian4,qie4)
-614B (tai4)
-614C (huang1,huang5)
-614D (yun4)
-614E (shen4)
-614F (ming3)
-6150 (none0)
-6151 (she4)
-6152 (cong2)
-6153 (piao1)
-6154 (mo4)
-6155 (mu4)
-6156 (guo2)
-6157 (chi4)
-6158 (can3,can4)
-6159 (can2)
-615A (can2)
-615B (cui2)
-615C (min3)
-615D (ni4,te4)
-615E (zhang1)
-615F (tong4)
-6160 (ao4)
-6161 (shuang3)
-6162 (man4)
-6163 (guan4)
-6164 (que4)
-6165 (zao4)
-6166 (jiu4)
-6167 (hui4)
-6168 (kai3,kai4)
-6169 (lian2)
-616A (ou4,ou1)
-616B (song3)
-616C (jin3)
-616D (yin4)
-616E (lu:4)
-616F (shang1)
-6170 (wei4)
-6171 (tuan2)
-6172 (man2)
-6173 (qian1)
-6174 (zhe2)
-6175 (yong1)
-6176 (qing4)
-6177 (kang1,kang3)
-6178 (di4)
-6179 (zhi2)
-617A (lu:2)
-617B (juan4)
-617C (qi1)
-617D (qi1)
-617E (yu4)
-617F (ping2)
-6180 (liao2)
-6181 (zong3)
-6182 (you1)
-6183 (chuang1)
-6184 (zhi4)
-6185 (tong4)
-6186 (cheng1)
-6187 (qi4)
-6188 (qu1)
-6189 (peng2)
-618A (bei4)
-618B (bie1)
-618C (chun2)
-618D (jiao1)
-618E (zeng1)
-618F (chi4)
-6190 (lian2)
-6191 (ping2)
-6192 (kui4)
-6193 (hui4)
-6194 (qiao2)
-6195 (cheng2)
-6196 (yin4)
-6197 (yin4)
-6198 (xi3)
-6199 (xi3)
-619A (dan4)
-619B (tan2)
-619C (duo4)
-619D (dui4)
-619E (dui4)
-619F (su4)
-61A0 (jue4)
-61A1 (ce4)
-61A2 (xiao1)
-61A3 (fan2)
-61A4 (fen4)
-61A5 (lao2)
-61A6 (lao4)
-61A7 (chong1)
-61A8 (han1)
-61A9 (qi4)
-61AA (xian2)
-61AB (min3)
-61AC (jing3)
-61AD (liao3)
-61AE (wu3)
-61AF (can3)
-61B0 (jue2)
-61B1 (chou4)
-61B2 (xian4)
-61B3 (tan3)
-61B4 (sheng2)
-61B5 (pi1)
-61B6 (yi4)
-61B7 (chu4)
-61B8 (xian1)
-61B9 (nao2)
-61BA (dan4)
-61BB (tan3)
-61BC (jing3)
-61BD (song1)
-61BE (han4)
-61BF (jiao1)
-61C0 (wei4)
-61C1 (huan2)
-61C2 (dong3)
-61C3 (qin2)
-61C4 (qin2)
-61C5 (qu2)
-61C6 (cao3)
-61C7 (ken3)
-61C8 (xie4)
-61C9 (ying4,ying1)
-61CA (ao4)
-61CB (mao4)
-61CC (yi4)
-61CD (lin3)
-61CE (se4)
-61CF (jun4)
-61D0 (huai2)
-61D1 (men4)
-61D2 (lan3)
-61D3 (ai4)
-61D4 (lin3)
-61D5 (yan1)
-61D6 (gua1)
-61D7 (xia4)
-61D8 (chi4)
-61D9 (yu3)
-61DA (yin4)
-61DB (dai1)
-61DC (meng3)
-61DD (ai4)
-61DE (meng3)
-61DF (dui4)
-61E0 (qi2)
-61E1 (mo3)
-61E2 (lan2)
-61E3 (men4)
-61E4 (chou2)
-61E5 (zhi4)
-61E6 (nuo4)
-61E7 (nuo4)
-61E8 (yan1,yan4)
-61E9 (yang3)
-61EA (bo2)
-61EB (zhi2)
-61EC (xing4)
-61ED (kuang4)
-61EE (you1)
-61EF (fu2)
-61F0 (liu2)
-61F1 (mie4)
-61F2 (cheng2)
-61F3 (none0)
-61F4 (chan4)
-61F5 (meng3)
-61F6 (lan3)
-61F7 (huai2)
-61F8 (xuan2)
-61F9 (rang4)
-61FA (chan4)
-61FB (ji4)
-61FC (ju4)
-61FD (huan1)
-61FE (she4,zhe2)
-61FF (yi4)
-6200 (lian4)
-6201 (nan3)
-6202 (mi2)
-6203 (tang3)
-6204 (jue2)
-6205 (gang4)
-6206 (gang4,zhuang4)
-6207 (zhuang4)
-6208 (ge1)
-6209 (yue4)
-620A (wu4)
-620B (jian1)
-620C (xu1,qu5)
-620D (shu4)
-620E (rong2)
-620F (xi4,hu1)
-6210 (cheng2)
-6211 (wo3)
-6212 (jie4)
-6213 (ge1)
-6214 (jian1)
-6215 (qiang1)
-6216 (huo4)
-6217 (qiang1,qiang4)
-6218 (zhan4)
-6219 (dong4)
-621A (qi1)
-621B (jia2)
-621C (die2)
-621D (cai2)
-621E (jia2)
-621F (ji3)
-6220 (shi4,chi4)
-6221 (kan1)
-6222 (ji2)
-6223 (kui2)
-6224 (gai4)
-6225 (deng3)
-6226 (zhan4)
-6227 (chuang1,qiang1,qiang4)
-6228 (ge1)
-6229 (jian3)
-622A (jie2)
-622B (yu4)
-622C (jian3)
-622D (yan3)
-622E (lu4)
-622F (xi4,hu1)
-6230 (zhan4)
-6231 (xi4)
-6232 (xi4,hu1)
-6233 (chuo1)
-6234 (dai4)
-6235 (qu2)
-6236 (hu4)
-6237 (hu4)
-6238 (hu4)
-6239 (e4)
-623A (shi4)
-623B (li4)
-623C (mao3)
-623D (hu4)
-623E (li4)
-623F (fang2)
-6240 (suo3)
-6241 (bian3,pian1)
-6242 (dian4)
-6243 (jiong1)
-6244 (shang3)
-6245 (yi2)
-6246 (yi3)
-6247 (shan4,shan1)
-6248 (hu4)
-6249 (fei1)
-624A (yan3)
-624B (shou3)
-624C (shou3)
-624D (cai2)
-624E (zha1,za1,zha2)
-624F (qiu2)
-6250 (le4)
-6251 (pu1)
-6252 (ba1,pa2,pa1)
-6253 (da3,da2)
-6254 (reng1)
-6255 (fu2,bi4)
-6256 (none0)
-6257 (zai4)
-6258 (tuo1)
-6259 (zhang4)
-625A (diao1)
-625B (kang2,gang1)
-625C (yu1)
-625D (ku1)
-625E (han4)
-625F (shen1)
-6260 (cha1)
-6261 (chi3)
-6262 (gu3)
-6263 (kou4)
-6264 (wu4)
-6265 (tuo1)
-6266 (qian1)
-6267 (zhi2)
-6268 (cha1)
-6269 (kuo4)
-626A (men2)
-626B (sao3,sao4)
-626C (yang2)
-626D (niu3)
-626E (ban4)
-626F (che3)
-6270 (rao3)
-6271 (xi1)
-6272 (qian2)
-6273 (ban1,pan1)
-6274 (jia2)
-6275 (yu2)
-6276 (fu2)
-6277 (ao4)
-6278 (xi1)
-6279 (pi1)
-627A (zhi3)
-627B (zi4)
-627C (e4)
-627D (dun4)
-627E (zhao3)
-627F (cheng2)
-6280 (ji4)
-6281 (yan3)
-6282 (kuang2)
-6283 (bian4)
-6284 (chao1)
-6285 (ju1)
-6286 (wen4)
-6287 (hu2)
-6288 (yue4)
-6289 (jue2)
-628A (ba3,ba4)
-628B (qin4)
-628C (zhen3)
-628D (zheng3)
-628E (yun3)
-628F (wan2)
-6290 (na4)
-6291 (yi4)
-6292 (shu1)
-6293 (zhua1)
-6294 (pou2)
-6295 (tou2)
-6296 (dou3)
-6297 (kang4)
-6298 (zhe2,she2,zhe1)
-6299 (pou2)
-629A (fu3)
-629B (pao1)
-629C (ba2)
-629D (ao3)
-629E (ze2,zhai2)
-629F (tuan2)
-62A0 (kou1)
-62A1 (lun2,lun1)
-62A2 (qiang3,qiang1)
-62A3 (none0)
-62A4 (hu4)
-62A5 (bao4)
-62A6 (bing3)
-62A7 (zhi3)
-62A8 (peng1)
-62A9 (tan1)
-62AA (pu1)
-62AB (pi1)
-62AC (tai2)
-62AD (yao3)
-62AE (zhen3)
-62AF (zha1)
-62B0 (yang3)
-62B1 (bao4)
-62B2 (he1)
-62B3 (ni3)
-62B4 (yi4)
-62B5 (di3)
-62B6 (chi4)
-62B7 (pi1)
-62B8 (za1)
-62B9 (mo3,ma1,mo4)
-62BA (mo3)
-62BB (chen1,shen4)
-62BC (ya1,ya2)
-62BD (chou1)
-62BE (qu1)
-62BF (min3)
-62C0 (chu4)
-62C1 (jia1)
-62C2 (fu2,bi4)
-62C3 (zha3)
-62C4 (zhu3)
-62C5 (dan1,dan4,dan3)
-62C6 (chai1,ca1)
-62C7 (mu3)
-62C8 (nian1,nian3)
-62C9 (la1,la2,la3,la4)
-62CA (fu3)
-62CB (pao1)
-62CC (ban4)
-62CD (pai1)
-62CE (lin1)
-62CF (na2)
-62D0 (guai3)
-62D1 (qian2)
-62D2 (ju4)
-62D3 (tuo4,ta4)
-62D4 (ba2)
-62D5 (tuo1)
-62D6 (tuo1)
-62D7 (ao4,niu4,yao4,ao3)
-62D8 (ju1)
-62D9 (zhuo1,zhuo2)
-62DA (pan4,pin1)
-62DB (zhao1)
-62DC (bai4)
-62DD (bai4)
-62DE (di3)
-62DF (ni3)
-62E0 (ju4,ju1)
-62E1 (kuo4)
-62E2 (long3)
-62E3 (jian3)
-62E4 (qia2)
-62E5 (yong1)
-62E6 (lan2)
-62E7 (ning3,ning2,ning4)
-62E8 (bo1)
-62E9 (ze2,zhai2)
-62EA (qian1)
-62EB (hen2)
-62EC (kuo4,gua1)
-62ED (shi4)
-62EE (jie2)
-62EF (zheng3)
-62F0 (nin3)
-62F1 (gong3)
-62F2 (gong3)
-62F3 (quan2)
-62F4 (shuan1)
-62F5 (tun2)
-62F6 (zan3,za1)
-62F7 (kao3)
-62F8 (chi3)
-62F9 (xie2)
-62FA (ce4)
-62FB (hui1)
-62FC (pin1)
-62FD (zhuai4,ye4,zhuai1)
-62FE (shi2,she4)
-62FF (na2)
-6300 (bo4)
-6301 (chi2)
-6302 (gua4)
-6303 (zhi4)
-6304 (kuo4)
-6305 (duo3)
-6306 (duo3)
-6307 (zhi3,zhi1,zhi2)
-6308 (qie4)
-6309 (an4)
-630A (nong4,long4)
-630B (zhen4)
-630C (ge2)
-630D (jiao4)
-630E (kua4)
-630F (dong4)
-6310 (ru2,na2)
-6311 (tiao3,tiao1)
-6312 (lie4)
-6313 (zha1)
-6314 (lu:3)
-6315 (die2)
-6316 (wa1)
-6317 (jue2)
-6318 (none0)
-6319 (ju3)
-631A (zhi4)
-631B (luan2)
-631C (ya4)
-631D (wo1,zhua1)
-631E (ta4)
-631F (xie2,jia1)
-6320 (nao2)
-6321 (dang3,dang4)
-6322 (jiao3,jia3)
-6323 (zheng1,zheng4)
-6324 (ji3)
-6325 (hui1)
-6326 (xian2)
-6327 (none0)
-6328 (ai1,ai2)
-6329 (tuo1)
-632A (nuo2)
-632B (cuo4)
-632C (bo2)
-632D (geng3)
-632E (ti3)
-632F (zhen4)
-6330 (cheng2)
-6331 (suo1)
-6332 (suo1,sa1,sha1)
-6333 (keng1,keng3)
-6334 (mei3)
-6335 (long4,nong4)
-6336 (ju2)
-6337 (peng2)
-6338 (jian3)
-6339 (yi4)
-633A (ting3)
-633B (shan1)
-633C (nuo4)
-633D (wan3)
-633E (xie2,jia2,xia2)
-633F (cha1)
-6340 (feng1)
-6341 (jiao3,jia3)
-6342 (wu3,wu2)
-6343 (jun4)
-6344 (jiu4)
-6345 (tong3)
-6346 (kun3)
-6347 (huo4)
-6348 (tu2)
-6349 (zhuo1)
-634A (pou2)
-634B (lu:3,luo1)
-634C (ba1)
-634D (han4)
-634E (shao1,shao4)
-634F (nie1)
-6350 (juan1)
-6351 (she4)
-6352 (shu4)
-6353 (ye2)
-6354 (jue2)
-6355 (bu3)
-6356 (huan2)
-6357 (bu4)
-6358 (jun4)
-6359 (yi4)
-635A (zhai1)
-635B (lu:3)
-635C (sou1)
-635D (tuo1)
-635E (lao1)
-635F (sun3)
-6360 (bang1)
-6361 (jian3)
-6362 (huan4)
-6363 (dao3)
-6364 (none0)
-6365 (wan4)
-6366 (qin2)
-6367 (peng3)
-6368 (she3,she4)
-6369 (lie4)
-636A (min2)
-636B (men2)
-636C (fu3)
-636D (bai3)
-636E (ju4,ju1)
-636F (dao2)
-6370 (wo3)
-6371 (ai2,ai1)
-6372 (juan3)
-6373 (yue4)
-6374 (zong3)
-6375 (chen3)
-6376 (chui2)
-6377 (jie2)
-6378 (tu1)
-6379 (ben4)
-637A (na4)
-637B (nian3)
-637C (nuo2)
-637D (zu2)
-637E (wo4)
-637F (xi1,qi1)
-6380 (xian1)
-6381 (cheng2)
-6382 (dian1)
-6383 (sao3,sao4)
-6384 (lun2,lun1)
-6385 (qing4)
-6386 (gang1)
-6387 (duo1,duo5)
-6388 (shou4)
-6389 (diao4)
-638A (pou2,pou3)
-638B (di3)
-638C (zhang3)
-638D (gun3)
-638E (ji3)
-638F (tao1)
-6390 (qia1)
-6391 (qi2)
-6392 (pai2,pai3)
-6393 (shu2)
-6394 (qian1)
-6395 (ling2)
-6396 (ye4,ye1,yi4)
-6397 (ya3)
-6398 (jue2)
-6399 (zheng1,zheng4)
-639A (liang3)
-639B (gua4)
-639C (yi3)
-639D (huo4)
-639E (shan4)
-639F (ding4)
-63A0 (lu:e4,lu:e3)
-63A1 (cai3)
-63A2 (tan4,tan1)
-63A3 (che4)
-63A4 (bing1)
-63A5 (jie1)
-63A6 (ti1)
-63A7 (kong4)
-63A8 (tui1)
-63A9 (yan3)
-63AA (cuo4)
-63AB (zou1)
-63AC (ju1,ju2)
-63AD (tian4)
-63AE (qian2)
-63AF (ken4)
-63B0 (bai1,bo4)
-63B1 (shou3,pa2)
-63B2 (jie1)
-63B3 (lu3)
-63B4 (guai1,guo2)
-63B5 (none0)
-63B6 (none0)
-63B7 (zhi4,zhi1)
-63B8 (dan3,shan4,shan3)
-63B9 (none0)
-63BA (chan1,shan3,can4)
-63BB (sao1)
-63BC (guan4)
-63BD (peng4)
-63BE (yuan4)
-63BF (nuo4)
-63C0 (jian3)
-63C1 (zheng1)
-63C2 (jiu1)
-63C3 (jian1)
-63C4 (yu2)
-63C5 (yan2)
-63C6 (kui2)
-63C7 (nan3)
-63C8 (hong1)
-63C9 (rou2)
-63CA (pi4)
-63CB (wei1)
-63CC (sai1)
-63CD (zou4)
-63CE (xuan1)
-63CF (miao2)
-63D0 (ti2,di1,shi2)
-63D1 (nie1)
-63D2 (cha1)
-63D3 (shi4)
-63D4 (zong3)
-63D5 (zhen4)
-63D6 (yi1)
-63D7 (shun3)
-63D8 (heng2)
-63D9 (bian4)
-63DA (yang2)
-63DB (huan4)
-63DC (yan3)
-63DD (zan3)
-63DE (an3)
-63DF (xu1,ju1)
-63E0 (ya4)
-63E1 (wo4)
-63E2 (ke4)
-63E3 (chuai3,chuai1,chuai4)
-63E4 (ji2,jie2)
-63E5 (ti4)
-63E6 (la2)
-63E7 (la4)
-63E8 (cheng2)
-63E9 (kai1)
-63EA (jiu1)
-63EB (jiu1)
-63EC (tu2)
-63ED (jie1)
-63EE (hui1)
-63EF (geng1)
-63F0 (chong4)
-63F1 (shuo4)
-63F2 (she2,die2)
-63F3 (xie1)
-63F4 (yuan2)
-63F5 (qian2)
-63F6 (ye2)
-63F7 (cha1)
-63F8 (zha1)
-63F9 (bei1)
-63FA (yao2)
-63FB (none0)
-63FC (none0)
-63FD (lan3)
-63FE (wen4)
-63FF (qin4)
-6400 (chan1)
-6401 (ge1,ge2)
-6402 (lou3,lou1)
-6403 (zong3)
-6404 (geng1)
-6405 (jiao3,jia3)
-6406 (gou4)
-6407 (qin4)
-6408 (yong3)
-6409 (que4)
-640A (chou1)
-640B (chuai1)
-640C (zhan3)
-640D (sun3)
-640E (sun1)
-640F (bo2)
-6410 (chu4)
-6411 (rong3)
-6412 (bang4,peng2)
-6413 (cuo1)
-6414 (sao1)
-6415 (ke4)
-6416 (yao2)
-6417 (dao3)
-6418 (zhi1)
-6419 (nu4)
-641A (xie2)
-641B (jian1)
-641C (sou1)
-641D (qiu3)
-641E (gao3)
-641F (xian3)
-6420 (shuo4)
-6421 (sang3)
-6422 (jin4)
-6423 (mie4)
-6424 (e4)
-6425 (chui2)
-6426 (nuo4)
-6427 (shan1)
-6428 (ta4)
-6429 (jie2)
-642A (tang2)
-642B (pan2)
-642C (ban1)
-642D (da1)
-642E (li4)
-642F (tao1)
-6430 (hu2)
-6431 (zhi4)
-6432 (wa1)
-6433 (xia2)
-6434 (qian1)
-6435 (wen4)
-6436 (qiang3,chuang3,qiang1)
-6437 (chen1)
-6438 (zhen1)
-6439 (e4)
-643A (xie2)
-643B (nuo4)
-643C (quan2)
-643D (cha2)
-643E (zha4)
-643F (ge2)
-6440 (wu3)
-6441 (en4)
-6442 (she4)
-6443 (gong4)
-6444 (she4)
-6445 (shu1)
-6446 (bai3)
-6447 (yao2)
-6448 (bin4)
-6449 (sou1)
-644A (tan1)
-644B (sha1)
-644C (chan3)
-644D (suo1)
-644E (liao2)
-644F (chong1)
-6450 (chuang1)
-6451 (guo2,guai1)
-6452 (bing4)
-6453 (feng2)
-6454 (shuai1)
-6455 (di4)
-6456 (qi4)
-6457 (none0)
-6458 (zhai1,zhe2)
-6459 (lian3)
-645A (cheng1)
-645B (chi1)
-645C (guan4)
-645D (lu4)
-645E (luo4)
-645F (lou3,lou1)
-6460 (zong3)
-6461 (gai4,xi4)
-6462 (hu4)
-6463 (zha1)
-6464 (chuang3)
-6465 (tang4)
-6466 (hua4)
-6467 (cui1)
-6468 (nai2)
-6469 (mo2,ma1)
-646A (jiang1)
-646B (gui1)
-646C (ying4)
-646D (zhi2)
-646E (ao2)
-646F (zhi4)
-6470 (chi4)
-6471 (man2)
-6472 (shan4)
-6473 (kou1)
-6474 (shu1)
-6475 (suo3)
-6476 (tuan2)
-6477 (zhao1)
-6478 (mo1,mo2)
-6479 (mo2)
-647A (zhe2)
-647B (chan1,shan3)
-647C (keng1)
-647D (biao1,biao4)
-647E (jiang4)
-647F (yin1)
-6480 (gou4)
-6481 (qian1)
-6482 (liao4,liao1,liao2)
-6483 (ji1)
-6484 (ying1)
-6485 (jue1)
-6486 (pie1)
-6487 (pie3,pie1)
-6488 (lao1)
-6489 (dun1)
-648A (xian4)
-648B (ruan2)
-648C (kui4)
-648D (zan3)
-648E (yi4)
-648F (xian2)
-6490 (cheng1)
-6491 (cheng1)
-6492 (sa1,sa3)
-6493 (nao2)
-6494 (heng4)
-6495 (si1)
-6496 (han4)
-6497 (huang2)
-6498 (da1)
-6499 (zun3)
-649A (nian3)
-649B (lin3)
-649C (zheng3)
-649D (hui1)
-649E (zhuang4,chuang2)
-649F (jiao3,jia3)
-64A0 (ji3)
-64A1 (cao1)
-64A2 (dan3)
-64A3 (dan3,shan3,shan4)
-64A4 (che4)
-64A5 (bo1)
-64A6 (che3)
-64A7 (jue2)
-64A8 (xiao1)
-64A9 (liao2,liao1,liao4)
-64AA (ben4)
-64AB (fu3)
-64AC (qiao4)
-64AD (bo1,bo4)
-64AE (cuo1,zuo3,cuo4,cuo3)
-64AF (zhuo2)
-64B0 (zhuan4)
-64B1 (tuo3)
-64B2 (pu1)
-64B3 (qin4)
-64B4 (dun1)
-64B5 (nian3)
-64B6 (none0)
-64B7 (xie2)
-64B8 (lu1)
-64B9 (jiao3,jia3)
-64BA (cuan1)
-64BB (ta4)
-64BC (han4)
-64BD (qiao4)
-64BE (zhua1,wo1)
-64BF (jian3)
-64C0 (gan3)
-64C1 (yong3,yong1)
-64C2 (lei2,lei4,lei1)
-64C3 (kuo3)
-64C4 (lu3)
-64C5 (shan4)
-64C6 (zhuo2)
-64C7 (ze2,zhai2)
-64C8 (pu1)
-64C9 (chuo4)
-64CA (ji2,ji1)
-64CB (dang3,dang4)
-64CC (se4)
-64CD (cao1,cao4)
-64CE (qing2)
-64CF (jing4)
-64D0 (huan4)
-64D1 (jie1)
-64D2 (qin2)
-64D3 (kuai3)
-64D4 (dan1,dan3,dan4)
-64D5 (xie2)
-64D6 (ge3)
-64D7 (pi3)
-64D8 (bo4,bai1)
-64D9 (ao4)
-64DA (ju4,ju1)
-64DB (ye4)
-64DC (none0)
-64DD (none0)
-64DE (sou3,sou4)
-64DF (mi2)
-64E0 (ji3)
-64E1 (tai2)
-64E2 (zhuo2)
-64E3 (dao3)
-64E4 (xing3)
-64E5 (lan3)
-64E6 (ca1)
-64E7 (ju3)
-64E8 (ye2)
-64E9 (ru3)
-64EA (ye4)
-64EB (ye4)
-64EC (ni3)
-64ED (huo4)
-64EE (ji2)
-64EF (bin4)
-64F0 (ning3,ning2)
-64F1 (ge1,ge2)
-64F2 (zhi4,zhi2)
-64F3 (jie2)
-64F4 (kuo4)
-64F5 (mo2,ma1)
-64F6 (jian4)
-64F7 (xie2)
-64F8 (lie4)
-64F9 (tan1)
-64FA (bai3)
-64FB (sou3,sou4)
-64FC (lu1)
-64FD (lu:e4)
-64FE (rao3)
-64FF (zhi2)
-6500 (pan1)
-6501 (yang3)
-6502 (lei4)
-6503 (sa4)
-6504 (shu1)
-6505 (zan3,cuan2)
-6506 (nian3)
-6507 (xian3)
-6508 (jun4)
-6509 (huo1)
-650A (lu:e4)
-650B (la4)
-650C (han4)
-650D (ying2)
-650E (lu2)
-650F (long3)
-6510 (qian1)
-6511 (qian1)
-6512 (zan3,cuan2)
-6513 (qian1)
-6514 (lan2)
-6515 (san1)
-6516 (ying1)
-6517 (mei2)
-6518 (rang3,rang2)
-6519 (chan1)
-651A (none0)
-651B (cuan1)
-651C (xie2,xi1)
-651D (she4)
-651E (luo1)
-651F (jun4)
-6520 (mi2)
-6521 (li2)
-6522 (zan3,cuan2)
-6523 (luan2)
-6524 (tan1)
-6525 (zuan4)
-6526 (li4)
-6527 (dian1)
-6528 (wa1)
-6529 (dang3)
-652A (jiao3,gao3,jia3)
-652B (jue2)
-652C (lan3)
-652D (li4)
-652E (nang3)
-652F (zhi1)
-6530 (gui4)
-6531 (gui3)
-6532 (qi1)
-6533 (xin2)
-6534 (po1)
-6535 (po1)
-6536 (shou1)
-6537 (kao3)
-6538 (you1)
-6539 (gai3)
-653A (gai3)
-653B (gong1)
-653C (gan1)
-653D (ban1)
-653E (fang4)
-653F (zheng4)
-6540 (bo2)
-6541 (dian1)
-6542 (kou4)
-6543 (min3)
-6544 (wu4)
-6545 (gu4)
-6546 (ge2)
-6547 (ce4)
-6548 (xiao4)
-6549 (mi3)
-654A (chu4)
-654B (ge2)
-654C (di2)
-654D (xu4)
-654E (jiao4)
-654F (min3)
-6550 (chen2)
-6551 (jiu4)
-6552 (shen1)
-6553 (duo2)
-6554 (yu3)
-6555 (chi4)
-6556 (ao2)
-6557 (bai4)
-6558 (xu4)
-6559 (jiao4,jiao1)
-655A (duo2)
-655B (lian3)
-655C (nie4)
-655D (bi4)
-655E (chang3,tang3)
-655F (dian4)
-6560 (duo2)
-6561 (yi4)
-6562 (gan3)
-6563 (san4,san3,san5)
-6564 (ke3)
-6565 (yan4)
-6566 (dun1,dui4)
-6567 (qi3)
-6568 (dou3)
-6569 (xiao4)
-656A (duo2)
-656B (jiao3,jia3)
-656C (jing4)
-656D (yang2)
-656E (xia2)
-656F (hun1,min3)
-6570 (shu4,shu3,shuo4)
-6571 (ai2)
-6572 (qiao1)
-6573 (ai2)
-6574 (zheng3)
-6575 (di2)
-6576 (zhen4)
-6577 (fu1)
-6578 (shu4,shu3,shuo4)
-6579 (liao2)
-657A (qu1)
-657B (xiong4)
-657C (xi3)
-657D (jiao3)
-657E (none0)
-657F (qiao2)
-6580 (zhuo2)
-6581 (yi4,du4)
-6582 (lian4,lian3)
-6583 (bi4)
-6584 (li4)
-6585 (xue2)
-6586 (xiao4)
-6587 (wen2,wen4)
-6588 (xue2)
-6589 (qi2,ji4,qi4)
-658A (qi2,ji4,qi4)
-658B (zhai1)
-658C (bin1)
-658D (jue2)
-658E (zhai1)
-658F (lang3)
-6590 (fei3)
-6591 (ban1)
-6592 (ban1)
-6593 (lan2)
-6594 (yu3)
-6595 (lan2)
-6596 (wei3)
-6597 (dou4,dou3)
-6598 (sheng1)
-6599 (liao4)
-659A (jia3)
-659B (hu2)
-659C (xie2,xia2)
-659D (jia3)
-659E (yu3)
-659F (zhen1)
-65A0 (jiao4)
-65A1 (wo4)
-65A2 (tiao3,tou4)
-65A3 (dou4)
-65A4 (jin1,jin5)
-65A5 (chi4)
-65A6 (yin2)
-65A7 (fu3)
-65A8 (qiang1)
-65A9 (zhan3)
-65AA (qu2,ju1)
-65AB (zhuo2)
-65AC (zhan3)
-65AD (duan4)
-65AE (zhuo2)
-65AF (si1)
-65B0 (xin1)
-65B1 (zhuo2)
-65B2 (zhuo2)
-65B3 (qin2)
-65B4 (lin2)
-65B5 (zhuo2)
-65B6 (chu4)
-65B7 (duan4)
-65B8 (zhu3)
-65B9 (fang1)
-65BA (xie4)
-65BB (hang2)
-65BC (wu1,yu1,yu2)
-65BD (shi1)
-65BE (pei4)
-65BF (you2)
-65C0 (none0)
-65C1 (pang2,bang4)
-65C2 (qi2)
-65C3 (zhan1)
-65C4 (mao2,mao4)
-65C5 (lu:3)
-65C6 (pei4)
-65C7 (pi1)
-65C8 (liu2)
-65C9 (fu1)
-65CA (fang3)
-65CB (xuan2,xuan4)
-65CC (jing1)
-65CD (jing1)
-65CE (ni3)
-65CF (zu2)
-65D0 (zhao4)
-65D1 (yi3)
-65D2 (liu2)
-65D3 (shao1)
-65D4 (jian4)
-65D5 (none0)
-65D6 (yi3)
-65D7 (qi2)
-65D8 (zhi4)
-65D9 (fan1)
-65DA (piao1)
-65DB (fan1)
-65DC (zhan1)
-65DD (guai4)
-65DE (sui4)
-65DF (yu2)
-65E0 (wu2,mo2)
-65E1 (ji4)
-65E2 (ji4)
-65E3 (ji4)
-65E4 (huo4)
-65E5 (ri4)
-65E6 (dan4)
-65E7 (jiu4)
-65E8 (zhi3)
-65E9 (zao3)
-65EA (xie2)
-65EB (tiao1)
-65EC (xun2)
-65ED (xu4)
-65EE (ga1)
-65EF (la2)
-65F0 (gan4)
-65F1 (han4)
-65F2 (tai2)
-65F3 (di4)
-65F4 (xu1)
-65F5 (chan3)
-65F6 (shi2)
-65F7 (kuang4)
-65F8 (yang2)
-65F9 (shi2)
-65FA (wang4)
-65FB (min2)
-65FC (min2)
-65FD (tun1)
-65FE (chun1)
-65FF (wu4)
-6600 (yun2)
-6601 (bei4)
-6602 (ang2)
-6603 (ze4)
-6604 (ban3)
-6605 (jie2)
-6606 (kun1)
-6607 (sheng1)
-6608 (hu4)
-6609 (fang3)
-660A (hao4)
-660B (gui4)
-660C (chang1)
-660D (xuan1)
-660E (ming2)
-660F (hun1)
-6610 (fen1)
-6611 (qin3)
-6612 (hu1)
-6613 (yi4)
-6614 (xi1,xi2)
-6615 (xin1)
-6616 (yan2)
-6617 (ze4)
-6618 (fang3)
-6619 (tan2)
-661A (shen4)
-661B (ju4)
-661C (yang2)
-661D (zan3)
-661E (bing3)
-661F (xing1)
-6620 (ying4)
-6621 (xuan4)
-6622 (pei3)
-6623 (zhen3)
-6624 (ling2)
-6625 (chun1)
-6626 (hao4)
-6627 (mei4)
-6628 (zuo2)
-6629 (mo4)
-662A (bian4)
-662B (xu4)
-662C (hun1)
-662D (zhao1)
-662E (zong4)
-662F (shi4)
-6630 (shi4)
-6631 (yu4)
-6632 (fei4,fu2)
-6633 (die2)
-6634 (mao3)
-6635 (ni4,ni3)
-6636 (chang3)
-6637 (wen1)
-6638 (dong1)
-6639 (ai3)
-663A (bing3)
-663B (ang2)
-663C (zhou4)
-663D (long2)
-663E (xian3)
-663F (kuang4)
-6640 (tiao3)
-6641 (chao2,zhao1,zhao4)
-6642 (shi2)
-6643 (huang3,huang4)
-6644 (huang3,huang4)
-6645 (xuan1)
-6646 (kui2)
-6647 (xu1,kua1)
-6648 (jiao3)
-6649 (jin4)
-664A (zhi3)
-664B (jin4)
-664C (shang3)
-664D (tong2)
-664E (hong3)
-664F (yan4)
-6650 (gai1)
-6651 (xiang3)
-6652 (shai4)
-6653 (xiao3)
-6654 (ye4)
-6655 (yun1,yun4)
-6656 (hui1)
-6657 (han2)
-6658 (han4)
-6659 (jun4)
-665A (wan3)
-665B (xian4)
-665C (kun1)
-665D (zhou4)
-665E (xi1)
-665F (sheng4,cheng2)
-6660 (sheng4)
-6661 (bu1)
-6662 (zhe2,zhe1,zhe5)
-6663 (zhe1)
-6664 (wu4)
-6665 (han4)
-6666 (hui4)
-6667 (hao4)
-6668 (chen2)
-6669 (wan3)
-666A (tian3)
-666B (zhuo1)
-666C (zui4)
-666D (zhou3)
-666E (pu3)
-666F (jing3,ying3)
-6670 (xi1)
-6671 (shan3)
-6672 (yi3)
-6673 (xi1)
-6674 (qing2)
-6675 (qi3)
-6676 (jing1)
-6677 (gui3)
-6678 (zhen3)
-6679 (yi4)
-667A (zhi4)
-667B (an3)
-667C (wan3)
-667D (lin2)
-667E (liang4)
-667F (chang1)
-6680 (wang3)
-6681 (xiao3)
-6682 (zan4)
-6683 (none0)
-6684 (xuan1)
-6685 (geng4)
-6686 (yi2)
-6687 (xia2,xia4)
-6688 (yun1,yun4)
-6689 (hui1)
-668A (fu3)
-668B (min3,min2)
-668C (kui2)
-668D (he4)
-668E (ying4)
-668F (du3)
-6690 (wei3)
-6691 (shu3)
-6692 (qing2)
-6693 (mao4)
-6694 (nan2)
-6695 (jian3)
-6696 (nuan3)
-6697 (an4)
-6698 (yang2)
-6699 (chun1)
-669A (yao2)
-669B (suo3)
-669C (pu3)
-669D (ming2,ming4)
-669E (jiao3)
-669F (kai3)
-66A0 (gao3)
-66A1 (weng3)
-66A2 (chang4)
-66A3 (qi4)
-66A4 (hao4)
-66A5 (yan4)
-66A6 (li4)
-66A7 (ai4)
-66A8 (ji4)
-66A9 (gui4)
-66AA (men3)
-66AB (zan4,zhan4)
-66AC (xie4)
-66AD (hao4)
-66AE (mu4)
-66AF (mo4)
-66B0 (cong1)
-66B1 (ni4)
-66B2 (zhang1)
-66B3 (hui4)
-66B4 (bao4,pu4)
-66B5 (han4)
-66B6 (xuan2)
-66B7 (chuan2)
-66B8 (liao3)
-66B9 (xian1)
-66BA (dan4)
-66BB (jing3)
-66BC (pie1)
-66BD (lin2)
-66BE (tun1)
-66BF (xi3)
-66C0 (yi4)
-66C1 (ji4)
-66C2 (kuang4)
-66C3 (dai4)
-66C4 (ye4)
-66C5 (ye4)
-66C6 (li4)
-66C7 (tan2)
-66C8 (tong2)
-66C9 (xiao3)
-66CA (fei4)
-66CB (qin3)
-66CC (zhao4)
-66CD (hao4)
-66CE (yi4)
-66CF (xiang4)
-66D0 (xing1)
-66D1 (sen1)
-66D2 (jiao3)
-66D3 (bao4)
-66D4 (jing4)
-66D5 (none0)
-66D6 (ai4)
-66D7 (ye4)
-66D8 (ru2)
-66D9 (shu3,shu4)
-66DA (meng2)
-66DB (xun1)
-66DC (yao4,yue4)
-66DD (pu4,bao4)
-66DE (li4)
-66DF (chen2)
-66E0 (kuang4)
-66E1 (die2)
-66E2 (none0)
-66E3 (yan4)
-66E4 (huo4)
-66E5 (lu2)
-66E6 (xi1)
-66E7 (rong2)
-66E8 (long2)
-66E9 (nang3)
-66EA (luo3)
-66EB (luan2)
-66EC (shai4)
-66ED (tang3)
-66EE (yan3)
-66EF (chu2)
-66F0 (yue1)
-66F1 (yue1)
-66F2 (qu3,qu1)
-66F3 (ye4,zhuai4,yi4)
-66F4 (geng4,geng1)
-66F5 (zhuai4)
-66F6 (hu1)
-66F7 (he2)
-66F8 (shu1)
-66F9 (cao2)
-66FA (cao2)
-66FB (sheng1)
-66FC (man4)
-66FD (ceng2,zeng1)
-66FE (ceng2,zeng1)
-66FF (ti4)
-6700 (zui4)
-6701 (can3)
-6702 (xu4)
-6703 (hui4,hui3,kuai4)
-6704 (yin4)
-6705 (qie4)
-6706 (fen1)
-6707 (pi2,bi4)
-6708 (yue4)
-6709 (you3,you4)
-670A (ruan3)
-670B (peng2)
-670C (ban1)
-670D (fu2,fu4)
-670E (ling2)
-670F (fei3)
-6710 (qu2)
-6711 (none0)
-6712 (nu:4)
-6713 (tiao4,tiao3)
-6714 (shuo4)
-6715 (zhen4)
-6716 (lang3)
-6717 (lang3)
-6718 (juan1,zui1)
-6719 (ming2)
-671A (huang1)
-671B (wang4)
-671C (tun1)
-671D (chao2,zhao1)
-671E (ji1,qi1)
-671F (qi1,ji1,qi2)
-6720 (ying1)
-6721 (zong3)
-6722 (wang4)
-6723 (tong2)
-6724 (lang3)
-6725 (none0)
-6726 (meng2)
-6727 (long2)
-6728 (mu4)
-6729 (deng3)
-672A (wei4)
-672B (mo4)
-672C (ben3)
-672D (zha2)
-672E (zhu2)
-672F (shu4,zhu2)
-6730 (none0)
-6731 (zhu1)
-6732 (ren2)
-6733 (ba1)
-6734 (po4,piao2,pu3,po1,pu2)
-6735 (duo3)
-6736 (duo3)
-6737 (dao1)
-6738 (li4)
-6739 (qiu2)
-673A (ji1)
-673B (jiu1)
-673C (bi3)
-673D (xiu3)
-673E (ting2)
-673F (ci4)
-6740 (sha1)
-6741 (none0)
-6742 (za2)
-6743 (quan2)
-6744 (qian1)
-6745 (yu2)
-6746 (gan1,gan3)
-6747 (wu1)
-6748 (cha1,cha4)
-6749 (shan1,sha1)
-674A (xun2)
-674B (fan2)
-674C (wu4)
-674D (zi3)
-674E (li3)
-674F (xing4)
-6750 (cai2)
-6751 (cun1)
-6752 (ren4)
-6753 (shao2,biao1)
-6754 (zhe2)
-6755 (di4)
-6756 (zhang4)
-6757 (mang2)
-6758 (chi4)
-6759 (yi4)
-675A (gu3)
-675B (gong1)
-675C (du4)
-675D (yi2)
-675E (qi3)
-675F (shu4)
-6760 (gang1,gang4)
-6761 (tiao2)
-6762 (none0)
-6763 (none0)
-6764 (none0)
-6765 (lai2)
-6766 (shan1)
-6767 (mang2)
-6768 (yang2)
-6769 (ma4)
-676A (miao3)
-676B (si4)
-676C (yuan2)
-676D (hang2)
-676E (fei4)
-676F (bei1)
-6770 (jie2)
-6771 (dong1)
-6772 (gao3)
-6773 (yao3,miao3)
-6774 (xian1)
-6775 (chu3)
-6776 (chun1)
-6777 (pa2,ba5)
-6778 (shu1)
-6779 (hua4)
-677A (xin2)
-677B (chou3,niu3)
-677C (zhu4)
-677D (chou3)
-677E (song1)
-677F (ban3)
-6780 (song1)
-6781 (ji2)
-6782 (yue4)
-6783 (yun2)
-6784 (gou4)
-6785 (ji1)
-6786 (mao2)
-6787 (pi2)
-6788 (bi4)
-6789 (wang3)
-678A (ang4)
-678B (fang1)
-678C (fen2)
-678D (yi4)
-678E (fu2)
-678F (nan2)
-6790 (xi1)
-6791 (hu4)
-6792 (ya2)
-6793 (dou3)
-6794 (xun2)
-6795 (zhen3,zhen4)
-6796 (yao3)
-6797 (lin2)
-6798 (rui4)
-6799 (e4)
-679A (mei2)
-679B (zhao4)
-679C (guo3)
-679D (zhi1,qi2)
-679E (zong1,cong1)
-679F (yun4)
-67A0 (none0)
-67A1 (dou3)
-67A2 (shu1)
-67A3 (zao3)
-67A4 (none0)
-67A5 (li4)
-67A6 (lu2)
-67A7 (jian3)
-67A8 (cheng2)
-67A9 (song1)
-67AA (qiang1)
-67AB (feng1)
-67AC (nan2)
-67AD (xiao1)
-67AE (xian1)
-67AF (ku1)
-67B0 (ping2)
-67B1 (tai2)
-67B2 (xi3)
-67B3 (zhi3,zhi1)
-67B4 (guai3)
-67B5 (xiao1)
-67B6 (jia4)
-67B7 (jia1)
-67B8 (gou3,gou1,ju3)
-67B9 (bao1,fu2)
-67BA (mo4)
-67BB (yi4)
-67BC (ye4)
-67BD (sang1)
-67BE (shi4)
-67BF (nie4)
-67C0 (bi3)
-67C1 (tuo2,duo4,duo1)
-67C2 (yi2)
-67C3 (ling2)
-67C4 (bing3,bing4)
-67C5 (ni3)
-67C6 (la1)
-67C7 (he2)
-67C8 (ban4)
-67C9 (fan2,bian1)
-67CA (zhong1)
-67CB (dai4)
-67CC (ci2)
-67CD (yang1)
-67CE (fu1)
-67CF (bo2,bai3,bo4)
-67D0 (mou3)
-67D1 (gan1)
-67D2 (qi1)
-67D3 (ran3)
-67D4 (rou2)
-67D5 (mao4)
-67D6 (zhao1)
-67D7 (song1)
-67D8 (zhe4)
-67D9 (xia2)
-67DA (you4,you2)
-67DB (shen1)
-67DC (ju3,gui4)
-67DD (tuo4)
-67DE (zuo4,zha4)
-67DF (nan2)
-67E0 (ning2)
-67E1 (yong3)
-67E2 (di3)
-67E3 (zhi2)
-67E4 (zha1)
-67E5 (cha2,zha1)
-67E6 (dan4)
-67E7 (gu1)
-67E8 (none0)
-67E9 (jiu4)
-67EA (ao1)
-67EB (fu2,bi4)
-67EC (jian3)
-67ED (bo1)
-67EE (duo4)
-67EF (ke1)
-67F0 (nai4)
-67F1 (zhu4)
-67F2 (bi4)
-67F3 (liu3)
-67F4 (chai2)
-67F5 (zha4)
-67F6 (si4)
-67F7 (zhu4)
-67F8 (pei1)
-67F9 (shi4)
-67FA (guai3)
-67FB (cha2,zha1)
-67FC (yao2)
-67FD (cheng1)
-67FE (jiu4)
-67FF (shi4)
-6800 (zhi1)
-6801 (liu3)
-6802 (mei2)
-6803 (none0)
-6804 (rong2)
-6805 (zha4,shan1)
-6806 (none0)
-6807 (biao1)
-6808 (zhan4)
-6809 (zhi4)
-680A (long2)
-680B (dong4)
-680C (lu2)
-680D (none0)
-680E (li4,yue4)
-680F (lan2)
-6810 (yong3)
-6811 (shu4)
-6812 (xun2)
-6813 (shuan1)
-6814 (qi4)
-6815 (zhen1)
-6816 (qi1,xi1)
-6817 (li4)
-6818 (chi2,yi2)
-6819 (xiang2)
-681A (zhen4)
-681B (li4)
-681C (su4)
-681D (gua1,kuo4)
-681E (kan1)
-681F (bing1,ben1)
-6820 (ren3)
-6821 (xiao4,jiao4)
-6822 (bo2,bai3)
-6823 (ren3)
-6824 (bing4)
-6825 (zi1)
-6826 (chou2)
-6827 (yi4)
-6828 (ci4)
-6829 (xu3)
-682A (zhu1)
-682B (jian4)
-682C (zui4)
-682D (er2)
-682E (er3)
-682F (yu4)
-6830 (fa2)
-6831 (gong3)
-6832 (kao3)
-6833 (lao3)
-6834 (zhan1)
-6835 (li4)
-6836 (none0)
-6837 (yang4)
-6838 (he2,hu2)
-6839 (gen1)
-683A (zhi3)
-683B (chi4)
-683C (ge2)
-683D (zai1)
-683E (luan2)
-683F (fa2)
-6840 (jie2)
-6841 (heng2,hang2)
-6842 (gui4)
-6843 (tao2)
-6844 (guang4,guang1)
-6845 (wei2)
-6846 (kuang4,kuang1)
-6847 (ru2)
-6848 (an4)
-6849 (an1)
-684A (juan4)
-684B (yi2)
-684C (zhuo1)
-684D (ku1)
-684E (zhi4,zhi2)
-684F (qiong2)
-6850 (tong2)
-6851 (sang1)
-6852 (sang1)
-6853 (huan2)
-6854 (jie2,ju2)
-6855 (jiu4)
-6856 (xue4)
-6857 (duo4)
-6858 (zhui1)
-6859 (yu2)
-685A (zan3)
-685B (none0)
-685C (ying1)
-685D (none0)
-685E (none0)
-685F (zhan4)
-6860 (ya1)
-6861 (rao2)
-6862 (zhen1)
-6863 (dang4)
-6864 (qi1)
-6865 (qiao2)
-6866 (hua4)
-6867 (gui4,hui4)
-6868 (jiang3)
-6869 (zhuang1)
-686A (xun2)
-686B (suo1)
-686C (suo1)
-686D (zhen4)
-686E (bei1)
-686F (ting1)
-6870 (kuo4)
-6871 (jing4)
-6872 (bo2)
-6873 (ben4)
-6874 (fu2)
-6875 (rui3)
-6876 (tong3)
-6877 (jue2)
-6878 (xi1)
-6879 (lang2)
-687A (liu3)
-687B (feng1)
-687C (qi1)
-687D (wen3)
-687E (jun1)
-687F (gan3)
-6880 (cu4)
-6881 (liang2)
-6882 (qiu2)
-6883 (ting3,ting4)
-6884 (you3)
-6885 (mei2)
-6886 (bang1)
-6887 (long4)
-6888 (peng1)
-6889 (zhuang1)
-688A (di4)
-688B (xuan1)
-688C (tu2)
-688D (zao4)
-688E (ao1)
-688F (gu4)
-6890 (bi4)
-6891 (di2)
-6892 (han2)
-6893 (zi3)
-6894 (zhi1)
-6895 (ren4)
-6896 (bei4)
-6897 (geng3)
-6898 (jian3)
-6899 (huan4)
-689A (wan3)
-689B (nuo2)
-689C (jia2)
-689D (tiao2)
-689E (ji4)
-689F (xiao1)
-68A0 (lu:3)
-68A1 (kuan3)
-68A2 (shao1,sao4)
-68A3 (cen2)
-68A4 (fen1)
-68A5 (song1)
-68A6 (meng4)
-68A7 (wu2)
-68A8 (li2)
-68A9 (li2)
-68AA (dou4)
-68AB (cen1)
-68AC (ying3)
-68AD (suo1)
-68AE (ju2)
-68AF (ti1)
-68B0 (xie4)
-68B1 (kun3)
-68B2 (zhuo2)
-68B3 (shu1)
-68B4 (chan1)
-68B5 (fan4)
-68B6 (wei3)
-68B7 (jing4)
-68B8 (li2)
-68B9 (bing1,bin1)
-68BA (none0)
-68BB (none0)
-68BC (tao2)
-68BD (zhi4)
-68BE (lai2)
-68BF (lian2)
-68C0 (jian3)
-68C1 (zhuo1)
-68C2 (ling2)
-68C3 (li2)
-68C4 (qi4)
-68C5 (bing3)
-68C6 (lun2)
-68C7 (cong1)
-68C8 (qian4)
-68C9 (mian2)
-68CA (qi2)
-68CB (qi2)
-68CC (cai3)
-68CD (gun4)
-68CE (chan2)
-68CF (de2)
-68D0 (fei3)
-68D1 (pai2)
-68D2 (bang4)
-68D3 (pou3,bang4)
-68D4 (hun1)
-68D5 (zong1)
-68D6 (cheng2)
-68D7 (zao3)
-68D8 (ji2)
-68D9 (li4)
-68DA (peng2)
-68DB (yu4)
-68DC (yu4)
-68DD (gu4)
-68DE (hun2)
-68DF (dong4)
-68E0 (tang2)
-68E1 (gang1)
-68E2 (wang3)
-68E3 (di4)
-68E4 (xi2)
-68E5 (fan2)
-68E6 (cheng1)
-68E7 (zhan4)
-68E8 (qi3)
-68E9 (yuan1)
-68EA (yan3)
-68EB (yu4)
-68EC (quan1)
-68ED (yi4)
-68EE (sen1)
-68EF (ren3)
-68F0 (chui2)
-68F1 (leng2,ling2,leng1)
-68F2 (qi1,xi1)
-68F3 (zhuo2)
-68F4 (fu2)
-68F5 (ke1)
-68F6 (lai2)
-68F7 (zou1)
-68F8 (zou1)
-68F9 (zhao4,zhuo1)
-68FA (guan1)
-68FB (fen1)
-68FC (fen2)
-68FD (chen1)
-68FE (qiong2)
-68FF (nie4)
-6900 (wan3)
-6901 (guo3)
-6902 (lu4)
-6903 (hao2)
-6904 (jie1)
-6905 (yi3,yi1)
-6906 (chou2)
-6907 (ju3)
-6908 (ju2)
-6909 (cheng2,sheng4)
-690A (zuo2)
-690B (liang2)
-690C (qiang1)
-690D (zhi2)
-690E (zhui1,chui2)
-690F (ya1)
-6910 (ju1)
-6911 (bei1,pi2)
-6912 (jiao1)
-6913 (zhuo2)
-6914 (zi1)
-6915 (bin1)
-6916 (peng2)
-6917 (ding4)
-6918 (chu3)
-6919 (shan1)
-691A (none0)
-691B (none0)
-691C (jian3)
-691D (gui1)
-691E (xi4)
-691F (du2)
-6920 (qian4)
-6921 (none0)
-6922 (kui4)
-6923 (none0)
-6924 (luo2)
-6925 (zhi1)
-6926 (none0)
-6927 (none0)
-6928 (none0)
-6929 (none0)
-692A (peng4)
-692B (shan4)
-692C (none0)
-692D (tuo3)
-692E (sen1)
-692F (duo2)
-6930 (ye1,ye2)
-6931 (fu4)
-6932 (wei3)
-6933 (wei1)
-6934 (duan4)
-6935 (jia3)
-6936 (zong1)
-6937 (jian1)
-6938 (yi2)
-6939 (shen4,zhen1,zhen4)
-693A (xi2)
-693B (yan4)
-693C (yan3)
-693D (chuan2)
-693E (zhan4)
-693F (chun1)
-6940 (yu3,ju3)
-6941 (he2)
-6942 (zha1,cha2)
-6943 (wo4)
-6944 (bian1)
-6945 (bi4)
-6946 (yao1)
-6947 (huo4)
-6948 (xu1)
-6949 (ruo4)
-694A (yang2)
-694B (la4)
-694C (yan2)
-694D (ben3)
-694E (hun2)
-694F (kui2)
-6950 (jie4)
-6951 (kui2)
-6952 (si1)
-6953 (feng1)
-6954 (xie1,xie4)
-6955 (tuo3)
-6956 (ji2)
-6957 (jian4)
-6958 (mu4)
-6959 (mao4)
-695A (chu3)
-695B (hu4,ku3)
-695C (hu2)
-695D (lian4)
-695E (leng2,leng4)
-695F (ting2)
-6960 (nan2)
-6961 (yu2)
-6962 (you2)
-6963 (mei2)
-6964 (song3)
-6965 (xuan4)
-6966 (xuan4)
-6967 (ying1)
-6968 (zhen1)
-6969 (pian2)
-696A (die2)
-696B (ji2)
-696C (jie2)
-696D (ye4)
-696E (chu3)
-696F (shun3,dun4)
-6970 (yu2)
-6971 (cou4)
-6972 (wei1)
-6973 (mei2)
-6974 (di4)
-6975 (ji2)
-6976 (jie2)
-6977 (kai3,jie1)
-6978 (qiu1)
-6979 (ying2)
-697A (rou2)
-697B (heng2)
-697C (lou2)
-697D (le4,yue4)
-697E (none0)
-697F (gui4)
-6980 (pin3)
-6981 (none0)
-6982 (gai4)
-6983 (tan2)
-6984 (lan3)
-6985 (yun2)
-6986 (yu2)
-6987 (chen4)
-6988 (lu:2)
-6989 (ju3)
-698A (none0)
-698B (none0)
-698C (none0)
-698D (xie4)
-698E (jia3)
-698F (yi4)
-6990 (zhan3)
-6991 (fu4)
-6992 (nuo4)
-6993 (mi4)
-6994 (lang2)
-6995 (rong2)
-6996 (gu3)
-6997 (jian4)
-6998 (ju4)
-6999 (ta3)
-699A (yao3)
-699B (zhen1)
-699C (bang3)
-699D (sha1)
-699E (yuan2)
-699F (zi3)
-69A0 (ming2)
-69A1 (su4)
-69A2 (jia4)
-69A3 (yao2)
-69A4 (jie2)
-69A5 (huang3)
-69A6 (gan4,han2)
-69A7 (fei3)
-69A8 (zha4)
-69A9 (qian2)
-69AA (ma4)
-69AB (sun3)
-69AC (yuan2)
-69AD (xie4)
-69AE (rong2)
-69AF (shi2)
-69B0 (zhi1)
-69B1 (cui1)
-69B2 (yun2)
-69B3 (ting2)
-69B4 (liu2)
-69B5 (rong2)
-69B6 (tang2)
-69B7 (que4)
-69B8 (zhai1)
-69B9 (si1)
-69BA (sheng4)
-69BB (ta4)
-69BC (ke4,ke2)
-69BD (xi1)
-69BE (gu4)
-69BF (qi1)
-69C0 (kao3)
-69C1 (gao3)
-69C2 (sun1)
-69C3 (pan2)
-69C4 (tao1)
-69C5 (ge2)
-69C6 (xun2)
-69C7 (dian1,zhen3)
-69C8 (nou4)
-69C9 (ji2)
-69CA (shuo4)
-69CB (gou4)
-69CC (chui2)
-69CD (qiang1)
-69CE (cha2)
-69CF (qian3)
-69D0 (huai2)
-69D1 (mei2)
-69D2 (xu4)
-69D3 (gang4)
-69D4 (gao1)
-69D5 (zhuo2)
-69D6 (tuo2)
-69D7 (qiao2)
-69D8 (yang4)
-69D9 (dian1)
-69DA (jia3)
-69DB (jian4,kan3)
-69DC (zui4)
-69DD (none0)
-69DE (long2)
-69DF (bin1,bing1)
-69E0 (zhu1)
-69E1 (none0)
-69E2 (xi2)
-69E3 (qi3)
-69E4 (lian2)
-69E5 (hui4)
-69E6 (yong2)
-69E7 (qian4)
-69E8 (guo3)
-69E9 (gai4)
-69EA (gai4)
-69EB (tuan2)
-69EC (hua4)
-69ED (qi1,cu4,qi4)
-69EE (sen1)
-69EF (cui1)
-69F0 (beng4)
-69F1 (you3)
-69F2 (hu2)
-69F3 (jiang3)
-69F4 (hu4)
-69F5 (huan4)
-69F6 (kui4)
-69F7 (yi4)
-69F8 (yi4)
-69F9 (gao1)
-69FA (kang1)
-69FB (gui1)
-69FC (gui1)
-69FD (cao2)
-69FE (man2,man4)
-69FF (jin3)
-6A00 (di4)
-6A01 (zhuang1)
-6A02 (le4,yue4)
-6A03 (lang3)
-6A04 (chen2)
-6A05 (cong1,zong1)
-6A06 (li2)
-6A07 (xiu1)
-6A08 (qing2)
-6A09 (shuang3)
-6A0A (fan2)
-6A0B (tong1)
-6A0C (guan4)
-6A0D (ji1)
-6A0E (suo1)
-6A0F (lei3)
-6A10 (lu3)
-6A11 (liang2)
-6A12 (mi4)
-6A13 (lou2)
-6A14 (chao2)
-6A15 (su4)
-6A16 (ke1)
-6A17 (chu1,shu1)
-6A18 (tang2)
-6A19 (biao1)
-6A1A (lu4)
-6A1B (jiu1)
-6A1C (shu4)
-6A1D (zha1)
-6A1E (shu1)
-6A1F (zhang1)
-6A20 (men2)
-6A21 (mo2,mu2)
-6A22 (niao3)
-6A23 (yang4)
-6A24 (tiao2)
-6A25 (peng2)
-6A26 (zhu4)
-6A27 (sha1)
-6A28 (xi1)
-6A29 (quan2)
-6A2A (heng2,heng4)
-6A2B (jian1)
-6A2C (cong1)
-6A2D (none0)
-6A2E (none0)
-6A2F (qiang2)
-6A30 (none0)
-6A31 (ying1)
-6A32 (er4)
-6A33 (xin2)
-6A34 (zhi2)
-6A35 (qiao2)
-6A36 (zui1)
-6A37 (cong2)
-6A38 (pu2,po4,pu3)
-6A39 (shu4)
-6A3A (hua4,hua2)
-6A3B (kui4)
-6A3C (zhen1)
-6A3D (zun1)
-6A3E (yue4)
-6A3F (zhan3)
-6A40 (xi1)
-6A41 (xun2)
-6A42 (dian4)
-6A43 (fa1)
-6A44 (gan3)
-6A45 (mo2,mu2)
-6A46 (wu3)
-6A47 (qiao1,cui4)
-6A48 (rao2,nao2)
-6A49 (lin4)
-6A4A (liu2)
-6A4B (qiao2)
-6A4C (xian4)
-6A4D (run4)
-6A4E (fan2)
-6A4F (zhan3)
-6A50 (tuo2)
-6A51 (lao3)
-6A52 (yun2)
-6A53 (shun4)
-6A54 (tui2)
-6A55 (cheng1)
-6A56 (tang2)
-6A57 (meng2)
-6A58 (ju2)
-6A59 (cheng2,chen2)
-6A5A (su4)
-6A5B (jue2)
-6A5C (jue2)
-6A5D (tan2)
-6A5E (hui4)
-6A5F (ji1)
-6A60 (nuo3)
-6A61 (xiang4)
-6A62 (tuo3)
-6A63 (ning3)
-6A64 (rui3)
-6A65 (zhu1)
-6A66 (tong2,chuang2)
-6A67 (zeng1)
-6A68 (fen4)
-6A69 (qiong2)
-6A6A (ran3)
-6A6B (heng2,heng4)
-6A6C (cen2)
-6A6D (gu1,ku1)
-6A6E (liu3)
-6A6F (lao4)
-6A70 (gao1)
-6A71 (chu2)
-6A72 (none0)
-6A73 (none0)
-6A74 (none0)
-6A75 (none0)
-6A76 (ji2)
-6A77 (dou1)
-6A78 (none0)
-6A79 (lu3)
-6A7A (none0)
-6A7B (none0)
-6A7C (yuan2)
-6A7D (ta4)
-6A7E (shu1)
-6A7F (jiang1)
-6A80 (tan2)
-6A81 (lin3)
-6A82 (nong2)
-6A83 (yin3)
-6A84 (xi2)
-6A85 (sui4)
-6A86 (shan1)
-6A87 (zui4)
-6A88 (xuan2)
-6A89 (cheng1)
-6A8A (gan4)
-6A8B (ju4)
-6A8C (zui4)
-6A8D (yi4)
-6A8E (qin2)
-6A8F (pu3)
-6A90 (yan2,yin2)
-6A91 (lei2)
-6A92 (feng1)
-6A93 (hui3)
-6A94 (dang3)
-6A95 (ji4)
-6A96 (sui4)
-6A97 (bo4,bo2)
-6A98 (bi4)
-6A99 (ding3)
-6A9A (chu3)
-6A9B (zhua1)
-6A9C (gui4,hui4,kuai4)
-6A9D (ji4)
-6A9E (jia3)
-6A9F (jia3)
-6AA0 (qing2)
-6AA1 (zhe4)
-6AA2 (jian3)
-6AA3 (qiang2)
-6AA4 (dao4)
-6AA5 (yi3)
-6AA6 (biao3)
-6AA7 (song1)
-6AA8 (she1)
-6AA9 (lin3)
-6AAA (li4,yue4)
-6AAB (cha2)
-6AAC (meng2)
-6AAD (yin2)
-6AAE (tao2)
-6AAF (tai2)
-6AB0 (mian2)
-6AB1 (qi2)
-6AB2 (none0)
-6AB3 (bin1,bing1)
-6AB4 (huo4)
-6AB5 (ji4)
-6AB6 (qian1)
-6AB7 (mi2,ni3)
-6AB8 (ning2)
-6AB9 (yi1)
-6ABA (gao3)
-6ABB (jian4,kan3)
-6ABC (yin4)
-6ABD (er2)
-6ABE (qing3)
-6ABF (yan3)
-6AC0 (qi2)
-6AC1 (mi4)
-6AC2 (zhao4)
-6AC3 (gui4,ju3)
-6AC4 (chun1)
-6AC5 (ji1)
-6AC6 (kui2)
-6AC7 (po2)
-6AC8 (deng4)
-6AC9 (chu2)
-6ACA (none0)
-6ACB (mian2)
-6ACC (you1)
-6ACD (zhi4)
-6ACE (guang4)
-6ACF (qian1)
-6AD0 (lei3)
-6AD1 (lei2,lei3)
-6AD2 (sa4)
-6AD3 (lu3)
-6AD4 (none0)
-6AD5 (cuan2)
-6AD6 (lu:2)
-6AD7 (mie4)
-6AD8 (hui4)
-6AD9 (ou1)
-6ADA (lu:2)
-6ADB (zhi4,jie2)
-6ADC (gao1)
-6ADD (du2)
-6ADE (yuan2)
-6ADF (li4,yue4)
-6AE0 (fei4)
-6AE1 (zhu4)
-6AE2 (sou3)
-6AE3 (lian2)
-6AE4 (none0)
-6AE5 (chu2)
-6AE6 (none0)
-6AE7 (zhu1)
-6AE8 (lu2)
-6AE9 (yan2)
-6AEA (li4)
-6AEB (zhu1)
-6AEC (chen4)
-6AED (jie2)
-6AEE (e4)
-6AEF (su1)
-6AF0 (huai2)
-6AF1 (nie4)
-6AF2 (yu4)
-6AF3 (long2)
-6AF4 (lai4)
-6AF5 (none0)
-6AF6 (xian3)
-6AF7 (none0)
-6AF8 (ju3)
-6AF9 (xiao1)
-6AFA (ling2)
-6AFB (ying1)
-6AFC (jian1)
-6AFD (yin3)
-6AFE (you2)
-6AFF (ying2)
-6B00 (xiang1)
-6B01 (nong2)
-6B02 (bo2)
-6B03 (chan1)
-6B04 (lan2)
-6B05 (ju3)
-6B06 (shuang1)
-6B07 (she4)
-6B08 (wei2)
-6B09 (cong4)
-6B0A (quan2)
-6B0B (qu2)
-6B0C (none0)
-6B0D (none0)
-6B0E (yu4)
-6B0F (luo2)
-6B10 (li4)
-6B11 (zan4)
-6B12 (luan2)
-6B13 (dang3)
-6B14 (jue2)
-6B15 (none0)
-6B16 (lan3)
-6B17 (lan2)
-6B18 (zhu3)
-6B19 (lei2)
-6B1A (li3,ji1)
-6B1B (ba4,ba3)
-6B1C (nang2)
-6B1D (yu4)
-6B1E (ling2)
-6B1F (none0)
-6B20 (qian4,qian5)
-6B21 (ci4)
-6B22 (huan1)
-6B23 (xin1)
-6B24 (yu2)
-6B25 (yu4)
-6B26 (qian1)
-6B27 (ou1)
-6B28 (xu1)
-6B29 (chao1)
-6B2A (chu4)
-6B2B (qi4)
-6B2C (kai4)
-6B2D (yi4)
-6B2E (jue2)
-6B2F (xi2)
-6B30 (xu1)
-6B31 (xia4)
-6B32 (yu4)
-6B33 (kuai4)
-6B34 (lang2)
-6B35 (kuan3)
-6B36 (shuo4)
-6B37 (xi1)
-6B38 (e^1,e^2,e^3,e^4,ai3,ai4)
-6B39 (yi1,qi1)
-6B3A (qi1)
-6B3B (hu1)
-6B3C (chi3)
-6B3D (qin1)
-6B3E (kuan3)
-6B3F (kan3)
-6B40 (kuan3)
-6B41 (kan3)
-6B42 (chuan2)
-6B43 (sha4)
-6B44 (none0)
-6B45 (yin1)
-6B46 (xin1)
-6B47 (xie1)
-6B48 (yu2)
-6B49 (qian4)
-6B4A (xiao1)
-6B4B (yi2)
-6B4C (ge1)
-6B4D (wu1)
-6B4E (tan4)
-6B4F (jin4)
-6B50 (ou1)
-6B51 (hu1)
-6B52 (ti4)
-6B53 (huan1)
-6B54 (xu1)
-6B55 (pen1)
-6B56 (xi1)
-6B57 (xiao4)
-6B58 (hu1)
-6B59 (she4,xi1,xi4)
-6B5A (none0)
-6B5B (lian4)
-6B5C (chu4)
-6B5D (yi4)
-6B5E (kan3)
-6B5F (yu2)
-6B60 (chuo4)
-6B61 (huan1)
-6B62 (zhi3)
-6B63 (zheng4,zheng1)
-6B64 (ci3)
-6B65 (bu4)
-6B66 (wu3)
-6B67 (qi2)
-6B68 (bu4)
-6B69 (bu4)
-6B6A (wai1)
-6B6B (ju4)
-6B6C (qian2)
-6B6D (chi2)
-6B6E (se4)
-6B6F (chi3)
-6B70 (se4)
-6B71 (zhong3)
-6B72 (sui4)
-6B73 (sui4)
-6B74 (li4)
-6B75 (cuo4)
-6B76 (yu2)
-6B77 (li4)
-6B78 (gui1)
-6B79 (dai3)
-6B7A (dai3)
-6B7B (si3)
-6B7C (jian1)
-6B7D (zhe2)
-6B7E (mo4)
-6B7F (mo4)
-6B80 (yao3)
-6B81 (mo4)
-6B82 (cu2)
-6B83 (yang1)
-6B84 (tian3)
-6B85 (sheng1)
-6B86 (dai4)
-6B87 (shang1)
-6B88 (xu1)
-6B89 (xun4)
-6B8A (shu1)
-6B8B (can2)
-6B8C (jue2)
-6B8D (piao3)
-6B8E (qia4)
-6B8F (qiu2)
-6B90 (su4)
-6B91 (qing2)
-6B92 (yun3)
-6B93 (lian4)
-6B94 (yi4)
-6B95 (fou3)
-6B96 (zhi2,shi5)
-6B97 (ye4)
-6B98 (can2)
-6B99 (hun1)
-6B9A (dan1)
-6B9B (ji2)
-6B9C (ye4)
-6B9D (none0)
-6B9E (yun3)
-6B9F (wen1)
-6BA0 (chou4,xiu4)
-6BA1 (bin4)
-6BA2 (ti4)
-6BA3 (jin4)
-6BA4 (shang1)
-6BA5 (yin2)
-6BA6 (diao1)
-6BA7 (cu4)
-6BA8 (hui4)
-6BA9 (cuan4)
-6BAA (yi4)
-6BAB (dan1,dan4)
-6BAC (du4)
-6BAD (jiang1)
-6BAE (lian4)
-6BAF (bin4)
-6BB0 (du2)
-6BB1 (jian1)
-6BB2 (jian1)
-6BB3 (shu1)
-6BB4 (ou1)
-6BB5 (duan4)
-6BB6 (zhu4)
-6BB7 (yin1,yan1,yin3)
-6BB8 (qing4)
-6BB9 (yi1)
-6BBA (sha1,shai4)
-6BBB (ke2,qiao4)
-6BBC (ke2,qiao4,que4)
-6BBD (yao2)
-6BBE (xun4)
-6BBF (dian4)
-6BC0 (hui3)
-6BC1 (hui3)
-6BC2 (gu3,gu1)
-6BC3 (que4)
-6BC4 (ji1)
-6BC5 (yi4)
-6BC6 (ou1)
-6BC7 (hui3)
-6BC8 (duan4)
-6BC9 (yi1)
-6BCA (xiao1)
-6BCB (wu2)
-6BCC (guan4)
-6BCD (mu3)
-6BCE (mei3)
-6BCF (mei3)
-6BD0 (ai3)
-6BD1 (zuo3)
-6BD2 (du2)
-6BD3 (yu4)
-6BD4 (bi3,bi4)
-6BD5 (bi4)
-6BD6 (bi4)
-6BD7 (pi2)
-6BD8 (pi2)
-6BD9 (bi4)
-6BDA (chan2)
-6BDB (mao2)
-6BDC (none0)
-6BDD (none0)
-6BDE (pi2)
-6BDF (none0)
-6BE0 (jia1)
-6BE1 (zhan1)
-6BE2 (sai1)
-6BE3 (mu4)
-6BE4 (tuo4)
-6BE5 (xun2)
-6BE6 (er4)
-6BE7 (rong2)
-6BE8 (xian3)
-6BE9 (ju2)
-6BEA (mu2)
-6BEB (hao2)
-6BEC (qiu2)
-6BED (dou4)
-6BEE (none0)
-6BEF (tan3)
-6BF0 (pei2)
-6BF1 (ju1)
-6BF2 (duo2)
-6BF3 (cui4)
-6BF4 (bi1)
-6BF5 (san1)
-6BF6 (none0)
-6BF7 (mao4)
-6BF8 (sui1)
-6BF9 (shu1)
-6BFA (yu1)
-6BFB (tuo4)
-6BFC (he2)
-6BFD (jian4)
-6BFE (ta4)
-6BFF (san1)
-6C00 (lu:2)
-6C01 (mu2)
-6C02 (li2)
-6C03 (tong2)
-6C04 (rong3)
-6C05 (chang3)
-6C06 (pu3)
-6C07 (lu3,lu5)
-6C08 (zhan1)
-6C09 (sao4)
-6C0A (zhan1)
-6C0B (meng2)
-6C0C (lu3)
-6C0D (qu2)
-6C0E (die2)
-6C0F (shi4,zhi1)
-6C10 (di3,di1)
-6C11 (min2)
-6C12 (jue2)
-6C13 (mang2,meng2)
-6C14 (qi4)
-6C15 (pie1)
-6C16 (nai3)
-6C17 (qi4)
-6C18 (dao1)
-6C19 (xian1)
-6C1A (chuan1)
-6C1B (fen1)
-6C1C (ri4)
-6C1D (nei4,nai3)
-6C1E (none0)
-6C1F (fu2)
-6C20 (shen1)
-6C21 (dong1)
-6C22 (qing1)
-6C23 (qi4)
-6C24 (yin1)
-6C25 (xi1)
-6C26 (hai4)
-6C27 (yang3)
-6C28 (an1)
-6C29 (ya4)
-6C2A (ke4)
-6C2B (qing1)
-6C2C (ya4)
-6C2D (dong1)
-6C2E (dan4)
-6C2F (lu:4)
-6C30 (qing2)
-6C31 (yang3)
-6C32 (yun1)
-6C33 (yun1)
-6C34 (shui3)
-6C35 (shui3)
-6C36 (zheng3)
-6C37 (bing1)
-6C38 (yong3)
-6C39 (dang4)
-6C3A (shui3)
-6C3B (le4)
-6C3C (ni4)
-6C3D (tun3)
-6C3E (fan4)
-6C3F (gui3)
-6C40 (ting1)
-6C41 (zhi1)
-6C42 (qiu2)
-6C43 (bin1)
-6C44 (ze4)
-6C45 (mian3)
-6C46 (cuan1)
-6C47 (hui4)
-6C48 (diao1)
-6C49 (han4)
-6C4A (cha4)
-6C4B (zhuo2)
-6C4C (chuan4)
-6C4D (wan2)
-6C4E (fan4)
-6C4F (dai4)
-6C50 (xi1,xi4)
-6C51 (tuo1)
-6C52 (mang3)
-6C53 (qiu2)
-6C54 (qi4)
-6C55 (shan4)
-6C56 (pai4)
-6C57 (han4,han2)
-6C58 (qian1)
-6C59 (wu1)
-6C5A (wu1)
-6C5B (xun4)
-6C5C (si4)
-6C5D (ru3)
-6C5E (gong3,hong4)
-6C5F (jiang1)
-6C60 (chi2)
-6C61 (wu1)
-6C62 (none0)
-6C63 (none0)
-6C64 (tang1,shang1)
-6C65 (zhi1)
-6C66 (chi2)
-6C67 (qian1)
-6C68 (mi4)
-6C69 (gu3)
-6C6A (wang1)
-6C6B (qing4)
-6C6C (jing3)
-6C6D (rui4)
-6C6E (jun1)
-6C6F (hong2)
-6C70 (tai4)
-6C71 (quan3)
-6C72 (ji2)
-6C73 (bian4)
-6C74 (bian4)
-6C75 (gan4)
-6C76 (wen4)
-6C77 (zhong1)
-6C78 (fang1)
-6C79 (xiong1)
-6C7A (jue2)
-6C7B (hu3)
-6C7C (none0)
-6C7D (qi4)
-6C7E (fen2)
-6C7F (xu4)
-6C80 (xu4)
-6C81 (qin4,shen4)
-6C82 (yi2)
-6C83 (wo4)
-6C84 (yun2)
-6C85 (yuan2)
-6C86 (hang4)
-6C87 (yan3)
-6C88 (shen3,chen2)
-6C89 (chen2)
-6C8A (dan4)
-6C8B (you2)
-6C8C (dun4,zhuan4)
-6C8D (hu4)
-6C8E (huo4)
-6C8F (qi1)
-6C90 (mu4)
-6C91 (rou2)
-6C92 (mei2,mo4)
-6C93 (ta4,da2,ta5)
-6C94 (mian3)
-6C95 (wu4)
-6C96 (chong1)
-6C97 (tian1)
-6C98 (bi3)
-6C99 (sha1,sha4)
-6C9A (zhi3)
-6C9B (pei4)
-6C9C (pan4)
-6C9D (zhui3)
-6C9E (za1)
-6C9F (gou1)
-6CA0 (liu2)
-6CA1 (mei2,mo4)
-6CA2 (ze2)
-6CA3 (feng1)
-6CA4 (ou4,ou1)
-6CA5 (li4)
-6CA6 (lun2)
-6CA7 (cang1)
-6CA8 (feng1)
-6CA9 (wei2)
-6CAA (hu4)
-6CAB (mo4)
-6CAC (mei4)
-6CAD (shu4)
-6CAE (ju3,ju4,ju1)
-6CAF (zan3)
-6CB0 (tuo1)
-6CB1 (tuo2)
-6CB2 (duo4)
-6CB3 (he2)
-6CB4 (li4)
-6CB5 (mi3)
-6CB6 (yi2)
-6CB7 (fu2)
-6CB8 (fei4)
-6CB9 (you2)
-6CBA (tian2)
-6CBB (zhi4)
-6CBC (zhao3)
-6CBD (gu1)
-6CBE (zhan1)
-6CBF (yan2,yan4)
-6CC0 (si1)
-6CC1 (kuang4)
-6CC2 (jiong3)
-6CC3 (ju1)
-6CC4 (xie4)
-6CC5 (qiu2)
-6CC6 (yi4)
-6CC7 (jia1)
-6CC8 (zhong1)
-6CC9 (quan2)
-6CCA (bo2,po1,po4)
-6CCB (hui4)
-6CCC (mi4,bi4)
-6CCD (ben1)
-6CCE (zhuo2)
-6CCF (chu4)
-6CD0 (le4)
-6CD1 (you3)
-6CD2 (gu1)
-6CD3 (hong2)
-6CD4 (gan1)
-6CD5 (fa3)
-6CD6 (mao3)
-6CD7 (si4)
-6CD8 (hu1)
-6CD9 (ping2)
-6CDA (ci3)
-6CDB (fan4,fan2)
-6CDC (zhi1)
-6CDD (su4)
-6CDE (ning4)
-6CDF (cheng1)
-6CE0 (ling2)
-6CE1 (pao4,pao1)
-6CE2 (bo1,po1)
-6CE3 (qi4,xie4)
-6CE4 (si4)
-6CE5 (ni2,ni4)
-6CE6 (ju2)
-6CE7 (yue4)
-6CE8 (zhu4)
-6CE9 (sheng1)
-6CEA (lei4)
-6CEB (xuan4)
-6CEC (xue4)
-6CED (fu1)
-6CEE (pan4)
-6CEF (min3)
-6CF0 (tai4)
-6CF1 (yang1)
-6CF2 (ji3)
-6CF3 (yong3)
-6CF4 (guan4)
-6CF5 (beng4)
-6CF6 (xue2)
-6CF7 (long2,shuang1)
-6CF8 (lu2)
-6CF9 (dan4)
-6CFA (luo4,po1)
-6CFB (xie4)
-6CFC (po1)
-6CFD (ze2)
-6CFE (jing1)
-6CFF (yin2)
-6D00 (zhou1)
-6D01 (jie2)
-6D02 (yi4)
-6D03 (hui1)
-6D04 (hui2)
-6D05 (zui3)
-6D06 (cheng2)
-6D07 (yin1)
-6D08 (wei2)
-6D09 (hou4)
-6D0A (jian4)
-6D0B (yang2)
-6D0C (lie4)
-6D0D (si4)
-6D0E (ji4)
-6D0F (er2)
-6D10 (xing2)
-6D11 (fu2,fu4)
-6D12 (sa3)
-6D13 (zi4)
-6D14 (zhi3)
-6D15 (yin1)
-6D16 (wu2)
-6D17 (xi3,xian3)
-6D18 (kao3)
-6D19 (zhu1)
-6D1A (jiang4)
-6D1B (luo4)
-6D1C (none0)
-6D1D (an4)
-6D1E (dong4)
-6D1F (yi2)
-6D20 (mou2)
-6D21 (lei3)
-6D22 (yi1)
-6D23 (mi3)
-6D24 (quan2)
-6D25 (jin1)
-6D26 (po4)
-6D27 (wei3)
-6D28 (xiao2)
-6D29 (xie4)
-6D2A (hong2)
-6D2B (xu4)
-6D2C (su4)
-6D2D (kuang1)
-6D2E (tao2)
-6D2F (qie4,jie2)
-6D30 (ju4)
-6D31 (er3)
-6D32 (zhou1)
-6D33 (ru4)
-6D34 (ping2)
-6D35 (xun2)
-6D36 (xiong1)
-6D37 (zhi4)
-6D38 (guang1,huang3)
-6D39 (huan2)
-6D3A (ming2)
-6D3B (huo2)
-6D3C (wa1)
-6D3D (qia4,xia2)
-6D3E (pai4,pa1)
-6D3F (wu1)
-6D40 (qu3)
-6D41 (liu2)
-6D42 (yi4)
-6D43 (jia1)
-6D44 (jing4)
-6D45 (qian3,jian1)
-6D46 (jiang1,jiang4)
-6D47 (jiao1)
-6D48 (zhen1)
-6D49 (shi1)
-6D4A (zhuo2)
-6D4B (ce4)
-6D4C (none0)
-6D4D (hui4,kuai4)
-6D4E (ji4,ji3)
-6D4F (liu2)
-6D50 (chan3)
-6D51 (hun2)
-6D52 (hu3,xu3)
-6D53 (nong2)
-6D54 (xun2)
-6D55 (jin4)
-6D56 (lie4)
-6D57 (qiu2)
-6D58 (wei3)
-6D59 (zhe4)
-6D5A (jun4,xun4)
-6D5B (han2)
-6D5C (bang1)
-6D5D (mang2)
-6D5E (zhuo2)
-6D5F (you2)
-6D60 (xi1)
-6D61 (bo2)
-6D62 (dou4)
-6D63 (huan4,wan3)
-6D64 (hong2)
-6D65 (yi4)
-6D66 (pu3)
-6D67 (ying3)
-6D68 (lan3)
-6D69 (hao4)
-6D6A (lang4)
-6D6B (han3)
-6D6C (li3)
-6D6D (geng1)
-6D6E (fu2)
-6D6F (wu2)
-6D70 (li4)
-6D71 (chun2)
-6D72 (feng2)
-6D73 (yi4)
-6D74 (yu4)
-6D75 (tong2)
-6D76 (lao2)
-6D77 (hai3)
-6D78 (jin4,jin1)
-6D79 (jia2,jia1)
-6D7A (chong1)
-6D7B (weng3)
-6D7C (mei3)
-6D7D (sui1)
-6D7E (cheng1)
-6D7F (pei4)
-6D80 (xian4)
-6D81 (shen4)
-6D82 (tu2)
-6D83 (kun4)
-6D84 (pin1)
-6D85 (nie4)
-6D86 (han4)
-6D87 (jing1)
-6D88 (xiao1)
-6D89 (she4)
-6D8A (nian3)
-6D8B (tu1)
-6D8C (yong3,chong1)
-6D8D (xiao1)
-6D8E (xian2)
-6D8F (ting3)
-6D90 (e2)
-6D91 (su4)
-6D92 (tun1)
-6D93 (juan1)
-6D94 (cen2)
-6D95 (ti4)
-6D96 (li4)
-6D97 (shui4)
-6D98 (si4)
-6D99 (lei4)
-6D9A (shui4)
-6D9B (tao1)
-6D9C (du2)
-6D9D (lao4)
-6D9E (lai2)
-6D9F (lian2)
-6DA0 (wei2)
-6DA1 (wo1,guo1)
-6DA2 (yun2)
-6DA3 (huan4)
-6DA4 (di2)
-6DA5 (none0)
-6DA6 (run4)
-6DA7 (jian4)
-6DA8 (zhang3,zhang4)
-6DA9 (se4)
-6DAA (fu2)
-6DAB (guan4)
-6DAC (xing4)
-6DAD (shou4)
-6DAE (shuan4)
-6DAF (ya2)
-6DB0 (chuo4)
-6DB1 (zhang4)
-6DB2 (ye4,yi4)
-6DB3 (kong1)
-6DB4 (wan3)
-6DB5 (han2)
-6DB6 (tuo1)
-6DB7 (dong1)
-6DB8 (he2,hao4)
-6DB9 (wo1)
-6DBA (ju1)
-6DBB (gan4)
-6DBC (liang2,liang4)
-6DBD (hun1)
-6DBE (ta4)
-6DBF (zhuo1)
-6DC0 (dian4)
-6DC1 (qie4)
-6DC2 (de2)
-6DC3 (juan4)
-6DC4 (zi1)
-6DC5 (xi1)
-6DC6 (xiao2,yao2)
-6DC7 (qi2)
-6DC8 (gu3)
-6DC9 (guo3)
-6DCA (han4)
-6DCB (lin2,lin4)
-6DCC (tang3)
-6DCD (zhou1)
-6DCE (peng3)
-6DCF (hao4)
-6DD0 (chang1)
-6DD1 (shu1,shu2)
-6DD2 (qi1)
-6DD3 (fang1)
-6DD4 (chi4)
-6DD5 (lu4)
-6DD6 (nao4)
-6DD7 (ju2)
-6DD8 (tao2)
-6DD9 (cong2)
-6DDA (lei4)
-6DDB (zhi4)
-6DDC (peng2)
-6DDD (fei2)
-6DDE (song1)
-6DDF (tian3)
-6DE0 (pi4)
-6DE1 (dan4)
-6DE2 (yu4)
-6DE3 (ni2)
-6DE4 (yu1)
-6DE5 (lu4)
-6DE6 (gan4)
-6DE7 (mi4)
-6DE8 (jing4)
-6DE9 (ling2)
-6DEA (lun2)
-6DEB (yin2)
-6DEC (cui4)
-6DED (qu2)
-6DEE (huai2)
-6DEF (yu4)
-6DF0 (nian4)
-6DF1 (shen1)
-6DF2 (piao2,hu1)
-6DF3 (chun2)
-6DF4 (hu1)
-6DF5 (yuan1)
-6DF6 (lai2)
-6DF7 (hun4,hun2,hun3)
-6DF8 (qing1)
-6DF9 (yan1,yan4)
-6DFA (qian3,jian1)
-6DFB (tian1)
-6DFC (miao3)
-6DFD (zhi3)
-6DFE (yin3)
-6DFF (mi4)
-6E00 (ben1)
-6E01 (yuan1)
-6E02 (wen4)
-6E03 (re4)
-6E04 (fei1)
-6E05 (qing1)
-6E06 (yuan1)
-6E07 (ke3)
-6E08 (ji4)
-6E09 (she4)
-6E0A (yuan1)
-6E0B (se4)
-6E0C (lu4)
-6E0D (zi4)
-6E0E (du2)
-6E0F (none0)
-6E10 (jian4,jian1)
-6E11 (mian3,sheng2)
-6E12 (pi4)
-6E13 (xi1)
-6E14 (yu2)
-6E15 (yuan1)
-6E16 (shen3)
-6E17 (shen4)
-6E18 (rou2)
-6E19 (huan4)
-6E1A (zhu3)
-6E1B (jian3)
-6E1C (nuan3)
-6E1D (yu2)
-6E1E (qiu2)
-6E1F (ting2)
-6E20 (qu2)
-6E21 (du4)
-6E22 (feng2)
-6E23 (zha1,zha3)
-6E24 (bo2)
-6E25 (wo4)
-6E26 (wo1,guo1)
-6E27 (di4)
-6E28 (wei1)
-6E29 (wen1)
-6E2A (ru2)
-6E2B (xie4)
-6E2C (ce4)
-6E2D (wei4)
-6E2E (ge1)
-6E2F (gang3)
-6E30 (yan3)
-6E31 (hong2)
-6E32 (xuan4)
-6E33 (mi3)
-6E34 (ke3)
-6E35 (mao2)
-6E36 (ying1)
-6E37 (yan3)
-6E38 (you2)
-6E39 (hong1)
-6E3A (miao3)
-6E3B (xing3)
-6E3C (mei3)
-6E3D (zai1)
-6E3E (hun2,hun4)
-6E3F (nai4)
-6E40 (kui2)
-6E41 (shi2)
-6E42 (e4)
-6E43 (pai4)
-6E44 (mei2)
-6E45 (lian4)
-6E46 (qi4)
-6E47 (qi4)
-6E48 (mei2)
-6E49 (tian2)
-6E4A (cou4)
-6E4B (wei2)
-6E4C (can1)
-6E4D (tuan1)
-6E4E (mian3)
-6E4F (xu1)
-6E50 (mo4)
-6E51 (xu3)
-6E52 (ji2)
-6E53 (pen2)
-6E54 (jian1)
-6E55 (jian3)
-6E56 (hu2)
-6E57 (feng4)
-6E58 (xiang1)
-6E59 (yi4)
-6E5A (yin4)
-6E5B (zhan4)
-6E5C (shi2)
-6E5D (jie1)
-6E5E (zhen1)
-6E5F (huang2)
-6E60 (tan4)
-6E61 (yu2)
-6E62 (bi4)
-6E63 (min3)
-6E64 (shi1)
-6E65 (tu2)
-6E66 (sheng1)
-6E67 (yong3,chong1)
-6E68 (ju2)
-6E69 (zhong4)
-6E6A (none0)
-6E6B (qiu1,jia3,jiao3,jiu1)
-6E6C (jiao3)
-6E6D (none0)
-6E6E (yin1,yan1)
-6E6F (tang1,shang1)
-6E70 (long2)
-6E71 (huo4)
-6E72 (yuan2)
-6E73 (nan3)
-6E74 (ban4)
-6E75 (you3)
-6E76 (quan2)
-6E77 (chui2)
-6E78 (liang4)
-6E79 (chan2)
-6E7A (yan2)
-6E7B (chun2)
-6E7C (nie4)
-6E7D (zi1)
-6E7E (wan1)
-6E7F (shi1)
-6E80 (man3)
-6E81 (ying2)
-6E82 (la4)
-6E83 (kui4,hui4)
-6E84 (none0)
-6E85 (jian4,jian1)
-6E86 (xu4)
-6E87 (lou2)
-6E88 (gui1)
-6E89 (gai4)
-6E8A (none0)
-6E8B (none0)
-6E8C (po1)
-6E8D (jin4)
-6E8E (gui4)
-6E8F (tang2)
-6E90 (yuan2)
-6E91 (suo3)
-6E92 (yuan2)
-6E93 (lian2)
-6E94 (yao3)
-6E95 (meng4)
-6E96 (zhun3)
-6E97 (sheng2)
-6E98 (ke4)
-6E99 (tai4)
-6E9A (ta3)
-6E9B (wa1)
-6E9C (liu1,liu4)
-6E9D (gou1)
-6E9E (sao1)
-6E9F (ming2)
-6EA0 (zha4)
-6EA1 (shi2)
-6EA2 (yi4)
-6EA3 (lun4)
-6EA4 (ma3)
-6EA5 (pu3)
-6EA6 (wei1)
-6EA7 (li4)
-6EA8 (cai2)
-6EA9 (wu4)
-6EAA (xi1,qi1)
-6EAB (wen1)
-6EAC (qiang1)
-6EAD (ce4)
-6EAE (shi1)
-6EAF (su4)
-6EB0 (yi1)
-6EB1 (zhen1,qin2)
-6EB2 (sou1)
-6EB3 (yun2)
-6EB4 (xiu4)
-6EB5 (yin1)
-6EB6 (rong2)
-6EB7 (hun4)
-6EB8 (su4)
-6EB9 (su4)
-6EBA (ni4,niao4)
-6EBB (ta4,ta1)
-6EBC (shi1)
-6EBD (ru4)
-6EBE (wei1)
-6EBF (pan4)
-6EC0 (chu4)
-6EC1 (chu2)
-6EC2 (pang1)
-6EC3 (weng1)
-6EC4 (cang1)
-6EC5 (mie4)
-6EC6 (he2)
-6EC7 (dian1)
-6EC8 (hao4)
-6EC9 (huang3)
-6ECA (xi4)
-6ECB (zi1)
-6ECC (di2)
-6ECD (zhi4)
-6ECE (ying2,xing2)
-6ECF (fu3)
-6ED0 (jie2)
-6ED1 (hua2,gu3)
-6ED2 (ge1)
-6ED3 (zi3)
-6ED4 (tao1)
-6ED5 (teng2)
-6ED6 (sui1)
-6ED7 (bi4)
-6ED8 (jiao4)
-6ED9 (hui4)
-6EDA (gun3)
-6EDB (yin2)
-6EDC (gao1)
-6EDD (long2,shuang1)
-6EDE (zhi4)
-6EDF (yan4)
-6EE0 (she4)
-6EE1 (man3)
-6EE2 (ying2)
-6EE3 (chun2)
-6EE4 (lu:4)
-6EE5 (lan4)
-6EE6 (luan2)
-6EE7 (xiao4)
-6EE8 (bin1)
-6EE9 (tan1)
-6EEA (yu4)
-6EEB (xiu3)
-6EEC (hu4)
-6EED (bi4)
-6EEE (biao1)
-6EEF (zhi4)
-6EF0 (jiang3)
-6EF1 (kou4)
-6EF2 (shen4)
-6EF3 (shang1)
-6EF4 (di1)
-6EF5 (mi4)
-6EF6 (ao2)
-6EF7 (lu3)
-6EF8 (hu3,xu3)
-6EF9 (hu1)
-6EFA (you2)
-6EFB (chan3)
-6EFC (fan4)
-6EFD (yong1)
-6EFE (gun3)
-6EFF (man3)
-6F00 (qing4)
-6F01 (yu2)
-6F02 (piao1,piao3,piao4)
-6F03 (ji2)
-6F04 (ya2)
-6F05 (jiao3)
-6F06 (qi1,qu4,xi1)
-6F07 (xi3)
-6F08 (ji4)
-6F09 (lu4)
-6F0A (lu:3,lou2)
-6F0B (long2)
-6F0C (jin3)
-6F0D (guo2)
-6F0E (cong2)
-6F0F (lou4)
-6F10 (zhi2)
-6F11 (gai4)
-6F12 (qiang2)
-6F13 (li2)
-6F14 (yan3)
-6F15 (cao2)
-6F16 (jiao4)
-6F17 (cong1)
-6F18 (chun2)
-6F19 (tuan2)
-6F1A (ou4,ou1)
-6F1B (teng2)
-6F1C (ye3)
-6F1D (xi2)
-6F1E (mi4)
-6F1F (tang2)
-6F20 (mo4)
-6F21 (shang1)
-6F22 (han4)
-6F23 (lian2)
-6F24 (lan3)
-6F25 (wa1)
-6F26 (li2)
-6F27 (qian2)
-6F28 (feng2)
-6F29 (xuan2)
-6F2A (yi1)
-6F2B (man4,man2)
-6F2C (zi4)
-6F2D (mang3)
-6F2E (kang1)
-6F2F (luo4,ta4)
-6F30 (peng1)
-6F31 (shu4)
-6F32 (zhang3,zhang4)
-6F33 (zhang1)
-6F34 (chong2)
-6F35 (xu4)
-6F36 (huan4)
-6F37 (kuo4,huo3)
-6F38 (jian4,jian1)
-6F39 (yan1)
-6F3A (chuang3,shuang3)
-6F3B (liao2)
-6F3C (cui3)
-6F3D (ti2)
-6F3E (yang4)
-6F3F (jiang1,jiang4)
-6F40 (cong2)
-6F41 (ying3)
-6F42 (hong2)
-6F43 (xiu1)
-6F44 (shu4)
-6F45 (guan4)
-6F46 (ying2)
-6F47 (xiao1)
-6F48 (none0)
-6F49 (none0)
-6F4A (xu4)
-6F4B (lian4)
-6F4C (zhi4)
-6F4D (wei2)
-6F4E (pi4)
-6F4F (yu4)
-6F50 (jiao4)
-6F51 (po1)
-6F52 (xiang4)
-6F53 (hui4)
-6F54 (jie2)
-6F55 (wu3)
-6F56 (pa2)
-6F57 (ji2)
-6F58 (pan1)
-6F59 (wei2)
-6F5A (xiao1,su4)
-6F5B (qian2)
-6F5C (qian2)
-6F5D (xi1)
-6F5E (lu4)
-6F5F (xi4)
-6F60 (sun4)
-6F61 (dun4)
-6F62 (huang2)
-6F63 (min3)
-6F64 (run4)
-6F65 (su4)
-6F66 (liao3,liao2,lao3)
-6F67 (zhen1)
-6F68 (zhong1)
-6F69 (yi4)
-6F6A (di2)
-6F6B (wan1)
-6F6C (dan4)
-6F6D (tan2)
-6F6E (chao2)
-6F6F (xun2)
-6F70 (kui4,hui4)
-6F71 (none0)
-6F72 (shao4)
-6F73 (tu2)
-6F74 (zhu1)
-6F75 (sa3)
-6F76 (hei1)
-6F77 (bi3,bi4)
-6F78 (shan1)
-6F79 (chan2)
-6F7A (chan2)
-6F7B (shu3)
-6F7C (tong2)
-6F7D (pu1)
-6F7E (lin2)
-6F7F (wei2)
-6F80 (se4)
-6F81 (se4)
-6F82 (cheng2,deng4)
-6F83 (jiong3)
-6F84 (cheng2,deng4)
-6F85 (hua4)
-6F86 (jiao1)
-6F87 (lao4,lao2)
-6F88 (che4)
-6F89 (gan3)
-6F8A (cun1)
-6F8B (heng4)
-6F8C (si1)
-6F8D (shu4)
-6F8E (peng2,peng1)
-6F8F (han4)
-6F90 (yun2)
-6F91 (liu4,liu1)
-6F92 (hong4)
-6F93 (fu2)
-6F94 (hao4)
-6F95 (he2)
-6F96 (xian1)
-6F97 (jian4)
-6F98 (shan1)
-6F99 (xi4)
-6F9A (ao4)
-6F9B (lu3)
-6F9C (lan2)
-6F9D (none0)
-6F9E (yu2)
-6F9F (lin3)
-6FA0 (min3,mian3,sheng2)
-6FA1 (zao3)
-6FA2 (dang1)
-6FA3 (huan3)
-6FA4 (ze2)
-6FA5 (xie4)
-6FA6 (yu4)
-6FA7 (li3)
-6FA8 (shi4)
-6FA9 (xue2)
-6FAA (ling2)
-6FAB (man4)
-6FAC (zi1)
-6FAD (yong1)
-6FAE (kuai4,hui4)
-6FAF (can4)
-6FB0 (lian4)
-6FB1 (dian4)
-6FB2 (ye4)
-6FB3 (ao4)
-6FB4 (huan2)
-6FB5 (lian4)
-6FB6 (chan2)
-6FB7 (man4)
-6FB8 (dan3)
-6FB9 (dan4,tan2)
-6FBA (yi4)
-6FBB (sui4)
-6FBC (pi4)
-6FBD (ju4)
-6FBE (ta4)
-6FBF (qin2)
-6FC0 (ji1)
-6FC1 (zhuo2)
-6FC2 (lian2)
-6FC3 (nong2)
-6FC4 (guo1)
-6FC5 (jin4)
-6FC6 (fen2)
-6FC7 (se4)
-6FC8 (ji2)
-6FC9 (sui1)
-6FCA (hui4)
-6FCB (chu3)
-6FCC (ta4)
-6FCD (song1)
-6FCE (ding3)
-6FCF (se4)
-6FD0 (zhu3)
-6FD1 (lai4)
-6FD2 (bin1)
-6FD3 (lian2)
-6FD4 (mi3)
-6FD5 (shi1)
-6FD6 (shu4)
-6FD7 (mi4)
-6FD8 (ning4,neng4)
-6FD9 (ying2)
-6FDA (ying2,xing2)
-6FDB (meng2)
-6FDC (jin4)
-6FDD (qi2)
-6FDE (bi4)
-6FDF (ji4,ji3)
-6FE0 (hao2)
-6FE1 (ru2)
-6FE2 (zui3,cui4)
-6FE3 (wo4)
-6FE4 (tao1,tao2)
-6FE5 (yin4)
-6FE6 (yin3)
-6FE7 (dui4)
-6FE8 (ci2)
-6FE9 (huo4)
-6FEA (jing4)
-6FEB (lan4)
-6FEC (jun4)
-6FED (ai4)
-6FEE (pu2)
-6FEF (zhuo2)
-6FF0 (wei2)
-6FF1 (bin1)
-6FF2 (gu3)
-6FF3 (qian2)
-6FF4 (xing2)
-6FF5 (bin1)
-6FF6 (kuo4)
-6FF7 (fei4)
-6FF8 (none0)
-6FF9 (bin1)
-6FFA (jian4,jian1)
-6FFB (dui4,wei2)
-6FFC (luo4)
-6FFD (luo4)
-6FFE (lu:4)
-6FFF (li4)
-7000 (you1)
-7001 (yang4)
-7002 (lu3)
-7003 (si4)
-7004 (jie2)
-7005 (ying4,ying2)
-7006 (du2)
-7007 (wang3)
-7008 (hui1)
-7009 (xie4)
-700A (pan2)
-700B (shen3)
-700C (biao1)
-700D (chan2)
-700E (mie4)
-700F (liu2)
-7010 (jian1)
-7011 (pu4,bao4)
-7012 (se4)
-7013 (cheng2)
-7014 (gu3)
-7015 (bin1,pin2)
-7016 (huo4)
-7017 (xian4)
-7018 (lu2)
-7019 (qin1)
-701A (han4)
-701B (ying2)
-701C (rong2)
-701D (li4)
-701E (jing4)
-701F (xiao1)
-7020 (ying2)
-7021 (sui3)
-7022 (wei2)
-7023 (xie4)
-7024 (huai2)
-7025 (hao4)
-7026 (zhu1)
-7027 (long2,shuang1)
-7028 (lai4)
-7029 (dui4)
-702A (fan2)
-702B (hu2)
-702C (lai4)
-702D (none0)
-702E (none0)
-702F (ying2)
-7030 (mi2)
-7031 (ji4)
-7032 (lian4)
-7033 (jian4)
-7034 (ying3)
-7035 (fen4)
-7036 (lin2)
-7037 (yi4)
-7038 (jian1)
-7039 (yue4)
-703A (chan2)
-703B (dai4)
-703C (rang2,rang4)
-703D (jian3)
-703E (lan2)
-703F (fan2)
-7040 (shuang4)
-7041 (yuan1)
-7042 (zhuo2)
-7043 (feng1)
-7044 (she4)
-7045 (lei3)
-7046 (lan2)
-7047 (cong2)
-7048 (qu2)
-7049 (yong1)
-704A (qian2)
-704B (fa3)
-704C (guan4)
-704D (que4)
-704E (yan4)
-704F (hao4)
-7050 (none0)
-7051 (sa3)
-7052 (zan4)
-7053 (luan2)
-7054 (yan4)
-7055 (li2)
-7056 (mi3)
-7057 (dan4)
-7058 (tan1)
-7059 (dang3)
-705A (jiao3)
-705B (chan3)
-705C (none0)
-705D (hao4)
-705E (ba4)
-705F (zhu2)
-7060 (lan3)
-7061 (lan2)
-7062 (nang3)
-7063 (wan1)
-7064 (luan2)
-7065 (quan2)
-7066 (xian1)
-7067 (yan4)
-7068 (gan4)
-7069 (yan4)
-706A (yu4)
-706B (huo3)
-706C (biao1)
-706D (mie4)
-706E (guang1)
-706F (deng1)
-7070 (hui1)
-7071 (xiao1)
-7072 (xiao1)
-7073 (none0)
-7074 (hong2)
-7075 (ling2)
-7076 (zao4)
-7077 (zhuan4)
-7078 (jiu3)
-7079 (zha4)
-707A (xie4)
-707B (chi4)
-707C (zhuo2)
-707D (zai1)
-707E (zai1)
-707F (can4)
-7080 (yang2)
-7081 (qi4)
-7082 (zhong1)
-7083 (fen2)
-7084 (niu3)
-7085 (gui4,jiong3)
-7086 (wen2)
-7087 (po4)
-7088 (yi4)
-7089 (lu2)
-708A (chui1,chui4)
-708B (pi1)
-708C (kai4)
-708D (pan4)
-708E (yan2)
-708F (kai4)
-7090 (pang4)
-7091 (mu4)
-7092 (chao3)
-7093 (liao4)
-7094 (gui4,que1)
-7095 (kang4)
-7096 (dun4)
-7097 (guang1)
-7098 (xin1)
-7099 (zhi4)
-709A (guang1)
-709B (xin1)
-709C (wei3)
-709D (qiang4)
-709E (bian4)
-709F (da2)
-70A0 (xia2)
-70A1 (zheng1)
-70A2 (zhu2)
-70A3 (ke3)
-70A4 (zhao4)
-70A5 (fu2)
-70A6 (ba2)
-70A7 (duo4)
-70A8 (duo4)
-70A9 (ling4)
-70AA (zhuo2)
-70AB (xuan4)
-70AC (ju4)
-70AD (tan4)
-70AE (pao4,bao1,pao2,pao1)
-70AF (jiong3)
-70B0 (pao2)
-70B1 (tai2)
-70B2 (tai2)
-70B3 (bing3)
-70B4 (yang3)
-70B5 (tong1,dong1)
-70B6 (han1)
-70B7 (zhu4)
-70B8 (zha4,zha2)
-70B9 (dian3,dian5)
-70BA (wei4,wei2)
-70BB (shi2)
-70BC (lian4)
-70BD (chi4)
-70BE (ping2)
-70BF (none0)
-70C0 (hu1)
-70C1 (shuo4)
-70C2 (lan4)
-70C3 (ting1)
-70C4 (jiao3)
-70C5 (xu4)
-70C6 (xing2)
-70C7 (quan4)
-70C8 (lie4)
-70C9 (huan4)
-70CA (yang2,yang4)
-70CB (xiao1)
-70CC (xiu1)
-70CD (xian3)
-70CE (yin2)
-70CF (wu1,wu4)
-70D0 (zhou1)
-70D1 (yao2)
-70D2 (shi4)
-70D3 (wei1)
-70D4 (tong2)
-70D5 (tong2)
-70D6 (zai1)
-70D7 (kai4)
-70D8 (hong1)
-70D9 (luo4,lao4)
-70DA (xia2)
-70DB (zhu2)
-70DC (xuan3)
-70DD (zheng1)
-70DE (po4)
-70DF (yan1,yin1)
-70E0 (hui3)
-70E1 (guang1)
-70E2 (zhe4)
-70E3 (hui1)
-70E4 (kao3)
-70E5 (none0)
-70E6 (fan2)
-70E7 (shao1)
-70E8 (ye4)
-70E9 (hui4)
-70EA (none0)
-70EB (tang4)
-70EC (jin4)
-70ED (re4)
-70EE (none0)
-70EF (xi1)
-70F0 (fu2)
-70F1 (jiong3)
-70F2 (che4)
-70F3 (pu3)
-70F4 (jing3,ting1)
-70F5 (zhuo2)
-70F6 (ting3)
-70F7 (wan2)
-70F8 (hai3)
-70F9 (peng1)
-70FA (lang3)
-70FB (shan1)
-70FC (hu1)
-70FD (feng1)
-70FE (chi4)
-70FF (rong2)
-7100 (hu2)
-7101 (none0)
-7102 (shu2)
-7103 (lang3)
-7104 (xun1)
-7105 (xun1)
-7106 (jue2)
-7107 (xiao1)
-7108 (xi1)
-7109 (yan1)
-710A (han4)
-710B (zhuang4)
-710C (qu1,jun4)
-710D (di4,ti1)
-710E (xie4)
-710F (qi4)
-7110 (wu4)
-7111 (none0)
-7112 (none0)
-7113 (han2)
-7114 (yan4)
-7115 (huan4)
-7116 (men4)
-7117 (ju2)
-7118 (dao4,tao1)
-7119 (bei4)
-711A (fen2)
-711B (lin4)
-711C (kun1)
-711D (hun4)
-711E (chun1)
-711F (xi2)
-7120 (cui4)
-7121 (wu2,mo2)
-7122 (hong1)
-7123 (ju4)
-7124 (fu3)
-7125 (yue1)
-7126 (jiao1)
-7127 (cong1)
-7128 (feng4)
-7129 (ping1)
-712A (qiong1)
-712B (cui4)
-712C (xi2)
-712D (qiong2)
-712E (xin4)
-712F (zhuo2,chao1,zhuo1)
-7130 (yan4)
-7131 (yan4)
-7132 (yi4)
-7133 (jue2)
-7134 (yu4)
-7135 (gang4)
-7136 (ran2)
-7137 (pi2)
-7138 (yan4)
-7139 (none0)
-713A (sheng1)
-713B (chang4)
-713C (shao1)
-713D (none0)
-713E (none0)
-713F (none0)
-7140 (none0)
-7141 (chen2)
-7142 (he4)
-7143 (kui3)
-7144 (zhong1)
-7145 (duan4)
-7146 (ya1)
-7147 (hui1)
-7148 (feng4)
-7149 (lian4)
-714A (xuan1)
-714B (xing1)
-714C (huang2)
-714D (jiao3)
-714E (jian1)
-714F (bi4)
-7150 (ying1)
-7151 (zhu3)
-7152 (wei3)
-7153 (tuan1)
-7154 (tian4)
-7155 (xi1)
-7156 (nuan3,xuan1)
-7157 (nuan3)
-7158 (chan2)
-7159 (yan1)
-715A (jiong3)
-715B (jiong3)
-715C (yu4)
-715D (mei4)
-715E (sha4,sha1)
-715F (wu4)
-7160 (ye4)
-7161 (xin4)
-7162 (qiong2)
-7163 (rou3)
-7164 (mei2)
-7165 (huan4)
-7166 (xu4,xu3)
-7167 (zhao4)
-7168 (wei1)
-7169 (fan2)
-716A (qiu2)
-716B (sui4)
-716C (yang2,yang4)
-716D (lie4)
-716E (zhu3)
-716F (none0)
-7170 (gao4)
-7171 (gua1)
-7172 (bao1)
-7173 (hu2)
-7174 (yun1)
-7175 (xia1)
-7176 (none0)
-7177 (none0)
-7178 (bian1)
-7179 (wei1)
-717A (tui4)
-717B (tang2)
-717C (chao3)
-717D (shan1,shan4)
-717E (yun1)
-717F (bo2)
-7180 (huang3)
-7181 (xie2)
-7182 (xi4)
-7183 (wu4)
-7184 (xi1,xi2)
-7185 (yun2)
-7186 (he2)
-7187 (he4)
-7188 (xi1)
-7189 (yun1)
-718A (xiong2)
-718B (nai2)
-718C (kao3)
-718D (none0)
-718E (yao4)
-718F (xun1,xun4)
-7190 (ming2)
-7191 (lian2)
-7192 (ying2)
-7193 (wen4)
-7194 (rong2)
-7195 (none0)
-7196 (none0)
-7197 (qiang4)
-7198 (liu4,liu1)
-7199 (xi1)
-719A (bi4)
-719B (biao1)
-719C (cong1)
-719D (lu4)
-719E (jian1)
-719F (shu2,shou2)
-71A0 (yi4)
-71A1 (lou2)
-71A2 (feng1)
-71A3 (sui1)
-71A4 (yi4)
-71A5 (teng1)
-71A6 (jue2)
-71A7 (zong1)
-71A8 (yun4,yu4)
-71A9 (hu4)
-71AA (yi2)
-71AB (zhi4)
-71AC (ao2,ao1)
-71AD (wei4)
-71AE (liao2)
-71AF (han4)
-71B0 (ou1)
-71B1 (re4)
-71B2 (jiong3)
-71B3 (man4)
-71B4 (none0)
-71B5 (shang1)
-71B6 (cuan4)
-71B7 (zeng1)
-71B8 (jian1)
-71B9 (xi1)
-71BA (xi1)
-71BB (xi1)
-71BC (yi4)
-71BD (xiao4)
-71BE (chi4)
-71BF (huang2)
-71C0 (chan3)
-71C1 (ye4)
-71C2 (qian2)
-71C3 (ran2)
-71C4 (yan4)
-71C5 (xian2)
-71C6 (qiao2)
-71C7 (zun1)
-71C8 (deng1)
-71C9 (dun4)
-71CA (shen1)
-71CB (jiao1)
-71CC (fen2)
-71CD (si1)
-71CE (liao2,liao3,liao4)
-71CF (yu4)
-71D0 (lin2)
-71D1 (tong2)
-71D2 (shao1)
-71D3 (fen2)
-71D4 (fan2)
-71D5 (yan4,yan1)
-71D6 (xun2)
-71D7 (lan4)
-71D8 (mei3)
-71D9 (tang4)
-71DA (yi1)
-71DB (jing3)
-71DC (men4)
-71DD (none0)
-71DE (none0)
-71DF (ying2)
-71E0 (yu4)
-71E1 (yi4)
-71E2 (xue2)
-71E3 (lan2)
-71E4 (tai4)
-71E5 (zao4)
-71E6 (can4)
-71E7 (sui4)
-71E8 (xi1)
-71E9 (que4)
-71EA (cong1)
-71EB (lian2)
-71EC (hui3)
-71ED (zhu2)
-71EE (xie4)
-71EF (ling2)
-71F0 (wei1)
-71F1 (yi4)
-71F2 (xie2)
-71F3 (zhao4)
-71F4 (hui4)
-71F5 (none0)
-71F6 (none0)
-71F7 (lan2)
-71F8 (ru2)
-71F9 (xian3)
-71FA (kao3)
-71FB (xun1)
-71FC (jin4)
-71FD (chou2)
-71FE (dao4,tao1,tao2)
-71FF (yao4)
-7200 (he4)
-7201 (lan4)
-7202 (biao1)
-7203 (rong2)
-7204 (li4)
-7205 (mo4)
-7206 (bao4)
-7207 (ruo4)
-7208 (di4)
-7209 (lu:4)
-720A (ao2)
-720B (xun4)
-720C (kuang4)
-720D (shuo4)
-720E (none0)
-720F (li4)
-7210 (lu2)
-7211 (jue2)
-7212 (liao4)
-7213 (yan4)
-7214 (xi1)
-7215 (xie4)
-7216 (long2)
-7217 (yan4)
-7218 (none0)
-7219 (rang3,shang4)
-721A (yue4)
-721B (lan4)
-721C (cong2)
-721D (jue2,jiao4)
-721E (tong2)
-721F (guan4)
-7220 (none0)
-7221 (che4)
-7222 (mi2)
-7223 (tang3)
-7224 (lan4)
-7225 (zhu2)
-7226 (lan3)
-7227 (ling2)
-7228 (cuan4)
-7229 (yu4)
-722A (zhua3,zhao3)
-722B (lan4)
-722C (pa2)
-722D (zheng1)
-722E (pao2)
-722F (zhao3)
-7230 (yuan2)
-7231 (ai4)
-7232 (wei4,wei2)
-7233 (none0)
-7234 (jue2)
-7235 (jue2)
-7236 (fu4,fu3)
-7237 (ye2)
-7238 (ba4)
-7239 (die1)
-723A (ye2)
-723B (yao2)
-723C (zu3)
-723D (shuang3)
-723E (er3)
-723F (pan2,qiang2,ban4)
-7240 (chuan2)
-7241 (ke1)
-7242 (zang1)
-7243 (zang1)
-7244 (qiang1)
-7245 (die2)
-7246 (qiang2)
-7247 (pian4,pian1)
-7248 (ban3)
-7249 (pan4)
-724A (shao2)
-724B (jian1)
-724C (pai2)
-724D (du2)
-724E (yong1)
-724F (tou2)
-7250 (tou2)
-7251 (bian1)
-7252 (die2)
-7253 (bang3)
-7254 (bo2)
-7255 (bang3)
-7256 (you3)
-7257 (none0)
-7258 (du2)
-7259 (ya2)
-725A (cheng4,cheng1)
-725B (niu2)
-725C (cheng1)
-725D (pin4)
-725E (jiu1)
-725F (mou2,mu4)
-7260 (ta1)
-7261 (mu3)
-7262 (lao2)
-7263 (ren4)
-7264 (mang2)
-7265 (fang1)
-7266 (mao2)
-7267 (mu4)
-7268 (ren4)
-7269 (wu4)
-726A (yan4)
-726B (fa2)
-726C (bei4)
-726D (si4)
-726E (jian4)
-726F (gu3)
-7270 (you4)
-7271 (gu3)
-7272 (sheng1)
-7273 (mu3)
-7274 (di3)
-7275 (qian1)
-7276 (quan4)
-7277 (quan2)
-7278 (zi4)
-7279 (te4)
-727A (xi1)
-727B (mang2)
-727C (keng1)
-727D (qian1)
-727E (wu3,wu2)
-727F (gu4)
-7280 (xi1)
-7281 (li2)
-7282 (li2)
-7283 (pou3)
-7284 (ji1)
-7285 (gang1)
-7286 (zhi2)
-7287 (ben1,ben4)
-7288 (quan2)
-7289 (run1)
-728A (du2)
-728B (ju4)
-728C (jia1)
-728D (jian1,qian2)
-728E (feng1)
-728F (pian1)
-7290 (ke1)
-7291 (ju2)
-7292 (kao4,di2)
-7293 (chu2)
-7294 (xi4)
-7295 (bei4)
-7296 (luo4)
-7297 (jie4)
-7298 (ma2)
-7299 (san1)
-729A (wei4)
-729B (li2)
-729C (dun1)
-729D (tong2)
-729E (se4)
-729F (jiang4)
-72A0 (xi1)
-72A1 (li4)
-72A2 (du2)
-72A3 (lie4)
-72A4 (pi2)
-72A5 (piao3)
-72A6 (bao4)
-72A7 (xi1)
-72A8 (chou1)
-72A9 (wei4)
-72AA (kui2)
-72AB (chou1)
-72AC (quan3,quan2)
-72AD (quan3)
-72AE (ba2)
-72AF (fan4)
-72B0 (qiu2)
-72B1 (bo2)
-72B2 (chai2)
-72B3 (chuo2)
-72B4 (an4,han1)
-72B5 (jie2)
-72B6 (zhuang4)
-72B7 (guang3)
-72B8 (ma3)
-72B9 (you2)
-72BA (kang4)
-72BB (bo2)
-72BC (hou3)
-72BD (ya2)
-72BE (han4)
-72BF (huan1)
-72C0 (zhuang4)
-72C1 (yun3)
-72C2 (kuang2)
-72C3 (niu3)
-72C4 (di2)
-72C5 (qing1)
-72C6 (zhong4)
-72C7 (yun3)
-72C8 (bei4)
-72C9 (pi1)
-72CA (ju2)
-72CB (ni2)
-72CC (sheng1)
-72CD (pao2)
-72CE (xia2)
-72CF (tuo2)
-72D0 (hu2)
-72D1 (ling2)
-72D2 (fei4)
-72D3 (pi1)
-72D4 (ni2)
-72D5 (sheng1)
-72D6 (you4)
-72D7 (gou3)
-72D8 (yue4)
-72D9 (ju1)
-72DA (dan4)
-72DB (bo4)
-72DC (gu3)
-72DD (xian3)
-72DE (ning2)
-72DF (huan2)
-72E0 (hen3)
-72E1 (jiao3,jia3)
-72E2 (he2,hao2,mo4)
-72E3 (zhao4)
-72E4 (ji2)
-72E5 (huan2)
-72E6 (shan1)
-72E7 (ta4)
-72E8 (rong2)
-72E9 (shou4)
-72EA (tong1)
-72EB (lao3)
-72EC (du2)
-72ED (xia2)
-72EE (shi1)
-72EF (kuai4)
-72F0 (zheng1)
-72F1 (yu4)
-72F2 (sun1)
-72F3 (yu2)
-72F4 (bi4)
-72F5 (mang2)
-72F6 (xi3)
-72F7 (juan4)
-72F8 (li2)
-72F9 (xia2)
-72FA (yin2)
-72FB (suan1)
-72FC (lang2)
-72FD (bei4)
-72FE (zhi4)
-72FF (yan2)
-7300 (sha1)
-7301 (li4)
-7302 (zhi4)
-7303 (xian3)
-7304 (jing1)
-7305 (han4)
-7306 (fei3)
-7307 (yao2)
-7308 (ba4,pi2)
-7309 (qi2)
-730A (ni2)
-730B (biao1)
-730C (yin4)
-730D (li2)
-730E (lie4)
-730F (jian1)
-7310 (qiang1)
-7311 (kun1)
-7312 (yan1)
-7313 (guo3)
-7314 (zong4)
-7315 (mi2)
-7316 (chang1)
-7317 (yi1)
-7318 (zhi4)
-7319 (zheng1)
-731A (ya2)
-731B (meng3)
-731C (cai1)
-731D (cu4)
-731E (she1)
-731F (lie4)
-7320 (none0)
-7321 (luo2)
-7322 (hu2)
-7323 (zong1)
-7324 (hu2)
-7325 (wei3)
-7326 (feng1)
-7327 (wo1)
-7328 (yuan2)
-7329 (xing1)
-732A (zhu1)
-732B (mao1,mao2)
-732C (wei4)
-732D (yuan2)
-732E (xian4)
-732F (tuan1)
-7330 (ya4)
-7331 (nao2)
-7332 (xie1,he4)
-7333 (jia1)
-7334 (hou2)
-7335 (bian1)
-7336 (you2)
-7337 (you2)
-7338 (mei2)
-7339 (cha2)
-733A (yao2)
-733B (sun1)
-733C (bo2)
-733D (ming2)
-733E (hua2)
-733F (yuan2)
-7340 (sou1)
-7341 (ma3)
-7342 (yuan2)
-7343 (dai1)
-7344 (yu4)
-7345 (shi1)
-7346 (hao2)
-7347 (none0)
-7348 (yi4)
-7349 (zhen1)
-734A (chuang4)
-734B (hao2)
-734C (man4)
-734D (jing4)
-734E (jiang3)
-734F (mo4)
-7350 (zhang1)
-7351 (chan2)
-7352 (ao2)
-7353 (ao2)
-7354 (hao2)
-7355 (cui1)
-7356 (ben4)
-7357 (jue2)
-7358 (bi4)
-7359 (bi4)
-735A (huang2)
-735B (bu3)
-735C (lin2)
-735D (yu4)
-735E (tong2)
-735F (yao4)
-7360 (liao2)
-7361 (shuo4)
-7362 (xiao1)
-7363 (shou4)
-7364 (none0)
-7365 (xi2)
-7366 (ge2)
-7367 (juan4)
-7368 (du2)
-7369 (hui4)
-736A (kuai4)
-736B (xian3)
-736C (xie4)
-736D (ta3)
-736E (xian3)
-736F (xun1)
-7370 (ning2)
-7371 (bian1)
-7372 (huo4)
-7373 (nou2)
-7374 (meng3)
-7375 (lie4)
-7376 (nao2)
-7377 (guang3)
-7378 (shou4)
-7379 (lu2)
-737A (ta4,ta3)
-737B (xian4)
-737C (mi2)
-737D (rang2)
-737E (huan1)
-737F (nao2)
-7380 (luo2)
-7381 (xian3)
-7382 (qi2)
-7383 (qu2)
-7384 (xuan2)
-7385 (miao4)
-7386 (zi1)
-7387 (lu:4,shuai4,shuo4)
-7388 (lu2)
-7389 (yu4)
-738A (su4)
-738B (wang2,wang4)
-738C (qiu2)
-738D (ga3)
-738E (ding1)
-738F (le4)
-7390 (ba1)
-7391 (ji1)
-7392 (hong2)
-7393 (di4)
-7394 (chuan4)
-7395 (gan1)
-7396 (jiu3)
-7397 (yu2)
-7398 (qi3)
-7399 (yu2)
-739A (yang2,chang4)
-739B (ma3)
-739C (hong2)
-739D (wu3)
-739E (fu1)
-739F (min2,wen2)
-73A0 (jie4)
-73A1 (ya2)
-73A2 (bin1,fen1)
-73A3 (bian4)
-73A4 (beng3)
-73A5 (yue4)
-73A6 (jue2)
-73A7 (yun3)
-73A8 (jue2)
-73A9 (wan2,wan4)
-73AA (jian1)
-73AB (mei2)
-73AC (dan3)
-73AD (pi2)
-73AE (wei3)
-73AF (huan2)
-73B0 (xian4)
-73B1 (qiang1)
-73B2 (ling2)
-73B3 (dai4)
-73B4 (yi4)
-73B5 (an2)
-73B6 (ping2)
-73B7 (dian4)
-73B8 (fu2)
-73B9 (xuan2)
-73BA (xi3)
-73BB (bo1)
-73BC (ci3)
-73BD (gou3)
-73BE (jia3)
-73BF (shao2)
-73C0 (po4)
-73C1 (ci2)
-73C2 (ke1)
-73C3 (ran3)
-73C4 (sheng1)
-73C5 (shen1)
-73C6 (yi2)
-73C7 (zu3)
-73C8 (jia1)
-73C9 (min2)
-73CA (shan1)
-73CB (liu3)
-73CC (bi4)
-73CD (zhen1)
-73CE (zhen1)
-73CF (jue2)
-73D0 (fa3,fa4)
-73D1 (long2)
-73D2 (jin1)
-73D3 (jiao4)
-73D4 (jian4)
-73D5 (li4)
-73D6 (guang1)
-73D7 (xian1)
-73D8 (zhou1)
-73D9 (gong3)
-73DA (yan1)
-73DB (xiu4)
-73DC (yang2)
-73DD (xu3)
-73DE (luo4)
-73DF (su4)
-73E0 (zhu1)
-73E1 (qin2)
-73E2 (ken4)
-73E3 (xun2)
-73E4 (bao3)
-73E5 (er3)
-73E6 (xiang2)
-73E7 (yao2)
-73E8 (xia2)
-73E9 (heng2,hang2)
-73EA (gui1)
-73EB (chong1)
-73EC (xu4)
-73ED (ban1)
-73EE (pei4)
-73EF (none0)
-73F0 (dang1)
-73F1 (ying1)
-73F2 (hun2,hui1)
-73F3 (wen2)
-73F4 (e2)
-73F5 (cheng2)
-73F6 (ti2,di4)
-73F7 (wu3)
-73F8 (wu2)
-73F9 (cheng2)
-73FA (jun4)
-73FB (mei2)
-73FC (bei4)
-73FD (ting3)
-73FE (xian4)
-73FF (chuo4)
-7400 (han2)
-7401 (xuan2)
-7402 (yan2)
-7403 (qiu2)
-7404 (quan3)
-7405 (lang2)
-7406 (li3)
-7407 (xiu4)
-7408 (fu2)
-7409 (liu2)
-740A (ya2,ye2)
-740B (xi1)
-740C (ling2)
-740D (li4)
-740E (jin1)
-740F (lian3)
-7410 (suo3)
-7411 (suo3)
-7412 (none0)
-7413 (wan2)
-7414 (dian4)
-7415 (bing3)
-7416 (zhan3)
-7417 (cui4)
-7418 (min2)
-7419 (yu4)
-741A (ju1)
-741B (chen1)
-741C (lai2)
-741D (wen2)
-741E (sheng4)
-741F (wei2)
-7420 (dian3)
-7421 (chu4)
-7422 (zhuo2,zuo2)
-7423 (pei3)
-7424 (cheng1)
-7425 (hu3)
-7426 (qi2)
-7427 (e4)
-7428 (kun1)
-7429 (chang1)
-742A (qi2)
-742B (beng3)
-742C (wan3)
-742D (lu4)
-742E (cong2)
-742F (guan3)
-7430 (yan3)
-7431 (diao1)
-7432 (bei4)
-7433 (lin2)
-7434 (qin2)
-7435 (pi2)
-7436 (pa2,ba5)
-7437 (qiang1)
-7438 (zhuo2)
-7439 (qin2)
-743A (fa4)
-743B (none0)
-743C (qiong2)
-743D (du3)
-743E (jie4)
-743F (hun2,hui1)
-7440 (yu3)
-7441 (mao4,mei4)
-7442 (mei2)
-7443 (chun1)
-7444 (xuan1)
-7445 (ti2)
-7446 (xing1)
-7447 (dai4)
-7448 (rou2)
-7449 (min2)
-744A (zhen1)
-744B (wei3)
-744C (ruan3)
-744D (huan4)
-744E (xie2)
-744F (chuan1)
-7450 (jian3)
-7451 (zhuan4)
-7452 (yang2)
-7453 (lian4)
-7454 (quan2)
-7455 (xia2)
-7456 (duan4)
-7457 (yuan4)
-7458 (ye2)
-7459 (nao3)
-745A (hu2)
-745B (ying1)
-745C (yu2)
-745D (huang2)
-745E (rui4)
-745F (se4)
-7460 (liu2)
-7461 (none0)
-7462 (rong2)
-7463 (suo3)
-7464 (yao2)
-7465 (wen1)
-7466 (wu3)
-7467 (jin1)
-7468 (jin4)
-7469 (ying2)
-746A (ma3)
-746B (tao1)
-746C (liu2)
-746D (tang2)
-746E (li4)
-746F (lang2)
-7470 (gui1)
-7471 (tian4)
-7472 (qiang1)
-7473 (cuo3)
-7474 (jue2)
-7475 (zhao3)
-7476 (yao2)
-7477 (ai4)
-7478 (bin1)
-7479 (tu2)
-747A (chang2)
-747B (kun1)
-747C (zhuan1)
-747D (cong1)
-747E (jin3)
-747F (yi1)
-7480 (cui3)
-7481 (cong1)
-7482 (qi2)
-7483 (li2,li5)
-7484 (ying3)
-7485 (suo3)
-7486 (qiu2)
-7487 (xuan2)
-7488 (ao2)
-7489 (lian2,lian3)
-748A (man2)
-748B (zhang1)
-748C (yin2)
-748D (none0)
-748E (ying1)
-748F (wei4)
-7490 (lu4)
-7491 (wu2)
-7492 (deng1)
-7493 (none0)
-7494 (zeng1)
-7495 (xun2)
-7496 (qu2)
-7497 (dang4)
-7498 (lin2)
-7499 (liao2)
-749A (qiong2)
-749B (su4)
-749C (huang2)
-749D (gui1)
-749E (pu2)
-749F (jing3)
-74A0 (fan2)
-74A1 (jin4)
-74A2 (liu2)
-74A3 (ji1)
-74A4 (none0)
-74A5 (jing3)
-74A6 (ai4)
-74A7 (bi4)
-74A8 (can4)
-74A9 (qu2)
-74AA (zao3)
-74AB (dang1)
-74AC (jiao3)
-74AD (gun4)
-74AE (tan3)
-74AF (hui4)
-74B0 (huan2)
-74B1 (se4)
-74B2 (sui4)
-74B3 (tian2)
-74B4 (none0)
-74B5 (yu2)
-74B6 (jin4)
-74B7 (fu1)
-74B8 (bin1)
-74B9 (shu2)
-74BA (wen4,wen2)
-74BB (zui3)
-74BC (lan2)
-74BD (xi3)
-74BE (ji4)
-74BF (xuan2)
-74C0 (ruan3)
-74C1 (huo4)
-74C2 (gai4)
-74C3 (lei2)
-74C4 (du2)
-74C5 (li4)
-74C6 (zhi2)
-74C7 (rou2)
-74C8 (li2)
-74C9 (zan4)
-74CA (qiong2)
-74CB (zhe2)
-74CC (gui1)
-74CD (sui4)
-74CE (la4)
-74CF (long2)
-74D0 (lu2)
-74D1 (li4)
-74D2 (zan4)
-74D3 (lan4)
-74D4 (ying1)
-74D5 (mi2)
-74D6 (xiang1)
-74D7 (xi1)
-74D8 (guan4)
-74D9 (dao4)
-74DA (zan4)
-74DB (huan2)
-74DC (gua1)
-74DD (bao2)
-74DE (die2)
-74DF (pao2)
-74E0 (hu4)
-74E1 (zhi2)
-74E2 (piao2)
-74E3 (ban4)
-74E4 (rang2)
-74E5 (li4)
-74E6 (wa3,wa4)
-74E7 (none0)
-74E8 (jiang1,hong2)
-74E9 (qian2,wa3)
-74EA (ban3)
-74EB (pen2)
-74EC (fang3)
-74ED (dan3)
-74EE (weng4)
-74EF (ou1)
-74F0 (none0)
-74F1 (none0)
-74F2 (none0)
-74F3 (hu2)
-74F4 (ling2)
-74F5 (yi2)
-74F6 (ping2)
-74F7 (ci2)
-74F8 (none0)
-74F9 (juan4)
-74FA (chang2)
-74FB (chi1)
-74FC (none0)
-74FD (dang4)
-74FE (meng3)
-74FF (bu4)
-7500 (chui2)
-7501 (ping2)
-7502 (bian1)
-7503 (zhou4)
-7504 (zhen1)
-7505 (none0)
-7506 (ci2)
-7507 (ying1)
-7508 (qi4)
-7509 (xian2)
-750A (lou3)
-750B (di4)
-750C (ou1)
-750D (meng2)
-750E (zhuan1)
-750F (beng4)
-7510 (lin2)
-7511 (zeng4)
-7512 (wu3)
-7513 (pi4)
-7514 (dan1)
-7515 (weng4)
-7516 (ying1)
-7517 (yan3)
-7518 (gan1)
-7519 (dai4)
-751A (shen4,shen2,she2)
-751B (tian2)
-751C (tian2)
-751D (han1)
-751E (chang2)
-751F (sheng1)
-7520 (qing2)
-7521 (shen1)
-7522 (chan3)
-7523 (chan3)
-7524 (rui2)
-7525 (sheng1)
-7526 (su1)
-7527 (shen1)
-7528 (yong4)
-7529 (shuai3)
-752A (lu4)
-752B (fu3)
-752C (yong3)
-752D (beng2)
-752E (none0)
-752F (ning2)
-7530 (tian2)
-7531 (you2)
-7532 (jia3)
-7533 (shen1)
-7534 (zha2)
-7535 (dian4)
-7536 (fu2)
-7537 (nan2)
-7538 (dian4)
-7539 (ping2)
-753A (ding1,ting3)
-753B (hua4)
-753C (ting3,ding1)
-753D (quan3)
-753E (zai1)
-753F (meng2)
-7540 (bi4)
-7541 (qi2)
-7542 (liu4)
-7543 (xun2)
-7544 (liu2)
-7545 (chang4)
-7546 (mu3)
-7547 (yun2)
-7548 (fan4)
-7549 (fu2)
-754A (geng1)
-754B (tian2)
-754C (jie4)
-754D (jie4)
-754E (quan3)
-754F (wei4)
-7550 (fu4)
-7551 (tian2)
-7552 (mu3)
-7553 (none0)
-7554 (pan4)
-7555 (jiang1)
-7556 (wa1)
-7557 (da2)
-7558 (nan2)
-7559 (liu2)
-755A (ben3)
-755B (zhen3)
-755C (chu4,xu4)
-755D (mu3)
-755E (mu3)
-755F (ce4)
-7560 (none0)
-7561 (gai1)
-7562 (bi4)
-7563 (da2)
-7564 (zhi4)
-7565 (lu:e4)
-7566 (qi2,xi1)
-7567 (lu:e4)
-7568 (pan1)
-7569 (none0)
-756A (fan1,pan1)
-756B (hua4)
-756C (yu2)
-756D (yu2)
-756E (mu3)
-756F (jun4)
-7570 (yi4)
-7571 (liu2)
-7572 (she1)
-7573 (die2)
-7574 (chou2)
-7575 (hua4)
-7576 (dang1,dang4)
-7577 (chuo4)
-7578 (ji1)
-7579 (wan3)
-757A (jiang1)
-757B (cheng2)
-757C (chang4)
-757D (tun3)
-757E (lei2)
-757F (ji1)
-7580 (cha1)
-7581 (liu2)
-7582 (die2)
-7583 (tuan3)
-7584 (lin2)
-7585 (jiang1)
-7586 (jiang1)
-7587 (chou2)
-7588 (bo4)
-7589 (die2)
-758A (die2)
-758B (pi3,shu1,ya3)
-758C (nie4)
-758D (dan4)
-758E (shu1)
-758F (shu1,shu4)
-7590 (zhi4)
-7591 (yi2)
-7592 (chuang2)
-7593 (nai3)
-7594 (ding1)
-7595 (bi3)
-7596 (jie1)
-7597 (liao2)
-7598 (gong1,gang1)
-7599 (ge1)
-759A (jiu4)
-759B (zhou3)
-759C (xia4)
-759D (shan4)
-759E (xu1)
-759F (nu:e4,yao4)
-75A0 (li4)
-75A1 (yang2)
-75A2 (chen4)
-75A3 (you2)
-75A4 (ba1)
-75A5 (jie4)
-75A6 (jue2)
-75A7 (xi1)
-75A8 (xia1)
-75A9 (cui4)
-75AA (bi4)
-75AB (yi4)
-75AC (li4)
-75AD (zong4)
-75AE (chuang1)
-75AF (feng1)
-75B0 (zhu4)
-75B1 (pao4)
-75B2 (pi2)
-75B3 (gan1)
-75B4 (ke1)
-75B5 (ci1,ci2)
-75B6 (xie4)
-75B7 (qi2)
-75B8 (dan3,da5)
-75B9 (zhen3)
-75BA (fa2)
-75BB (zhi3)
-75BC (teng2)
-75BD (ju1)
-75BE (ji2)
-75BF (fei4)
-75C0 (ju1)
-75C1 (dian4)
-75C2 (jia1)
-75C3 (xuan2,xian2)
-75C4 (zha4)
-75C5 (bing4)
-75C6 (nie4)
-75C7 (zheng4,zheng1)
-75C8 (yong1)
-75C9 (jing4)
-75CA (quan2)
-75CB (chong2)
-75CC (tong1)
-75CD (yi2)
-75CE (jie4)
-75CF (wei3)
-75D0 (hui2)
-75D1 (duo3)
-75D2 (yang3)
-75D3 (chi4)
-75D4 (zhi4)
-75D5 (hen2)
-75D6 (ya3)
-75D7 (mei4)
-75D8 (dou4)
-75D9 (jing4)
-75DA (xiao1)
-75DB (tong4)
-75DC (tu1)
-75DD (mang2)
-75DE (pi3)
-75DF (xiao1)
-75E0 (suan1)
-75E1 (pu1)
-75E2 (li4)
-75E3 (zhi4)
-75E4 (cuo2)
-75E5 (duo2)
-75E6 (wu4)
-75E7 (sha1)
-75E8 (lao2)
-75E9 (shou4)
-75EA (huan4)
-75EB (xian2)
-75EC (yi4)
-75ED (peng2)
-75EE (zhang4)
-75EF (guan3)
-75F0 (tan2)
-75F1 (fei4)
-75F2 (ma2)
-75F3 (lin2)
-75F4 (chi1)
-75F5 (ji4)
-75F6 (tian3)
-75F7 (an1)
-75F8 (chi4)
-75F9 (bi4)
-75FA (bi4)
-75FB (min2)
-75FC (gu4,gu1)
-75FD (dui1)
-75FE (e1)
-75FF (wei3)
-7600 (yu1)
-7601 (cui4)
-7602 (ya3)
-7603 (zhu2)
-7604 (xi1)
-7605 (dan4,dan1,dan3)
-7606 (shen4)
-7607 (zhong3)
-7608 (ji4,zhi4)
-7609 (yu4)
-760A (hou2)
-760B (feng1)
-760C (la4)
-760D (yang2)
-760E (shen4)
-760F (tu2)
-7610 (yu3)
-7611 (gua1)
-7612 (wen2)
-7613 (huan4)
-7614 (ku4)
-7615 (jia3,xia2)
-7616 (yin1)
-7617 (yi4)
-7618 (lou4)
-7619 (sao4)
-761A (jue2)
-761B (chi4)
-761C (xi2)
-761D (guan1)
-761E (yi4)
-761F (wen1)
-7620 (ji2)
-7621 (chuang1)
-7622 (ban1)
-7623 (lei3)
-7624 (liu2)
-7625 (chai4,cuo2)
-7626 (shou4)
-7627 (nu:e4,yao4)
-7628 (dian1)
-7629 (da2,da5)
-762A (bie1,bie3)
-762B (tan1)
-762C (zhang4)
-762D (biao1)
-762E (shen4)
-762F (cu4)
-7630 (luo3)
-7631 (yi4)
-7632 (zong4)
-7633 (chou1)
-7634 (zhang4)
-7635 (zhai4)
-7636 (sou4)
-7637 (suo3)
-7638 (que2)
-7639 (diao4)
-763A (lou4)
-763B (lou4)
-763C (mo4)
-763D (jin4)
-763E (yin3)
-763F (ying3)
-7640 (huang2)
-7641 (fu2)
-7642 (liao2)
-7643 (long2)
-7644 (qiao2)
-7645 (liu2)
-7646 (lao2)
-7647 (xian2)
-7648 (fei4)
-7649 (dan4,dan1,dan3)
-764A (yin4)
-764B (he4)
-764C (ai2,yan2)
-764D (ban1)
-764E (xian2)
-764F (guan1)
-7650 (guai4)
-7651 (nong2)
-7652 (yu4)
-7653 (wei2)
-7654 (yi4)
-7655 (yong1)
-7656 (pi3,pi4)
-7657 (lei3)
-7658 (li4,ji1)
-7659 (shu3)
-765A (dan4)
-765B (lin3)
-765C (dian4)
-765D (lin3)
-765E (lai4)
-765F (bie1,bie3)
-7660 (ji4)
-7661 (chi1)
-7662 (yang3)
-7663 (xuan3)
-7664 (jie1)
-7665 (zheng1,zheng4)
-7666 (none0)
-7667 (li4)
-7668 (huo4)
-7669 (lai4)
-766A (ji1)
-766B (dian1)
-766C (xian3,xuan3)
-766D (ying3)
-766E (yin3)
-766F (qu2)
-7670 (yong1)
-7671 (tan1)
-7672 (dian1)
-7673 (luo3)
-7674 (luan2)
-7675 (luan2)
-7676 (bo1)
-7677 (none0)
-7678 (gui3)
-7679 (po1)
-767A (fa1)
-767B (deng1)
-767C (fa1)
-767D (bai2)
-767E (bai3,bo2)
-767F (qie2)
-7680 (bi1)
-7681 (zao4)
-7682 (zao4)
-7683 (mao4)
-7684 (de5,di4,di2)
-7685 (pa1)
-7686 (jie1)
-7687 (huang2)
-7688 (gui1)
-7689 (ci3)
-768A (ling2)
-768B (gao1)
-768C (mo4)
-768D (ji4)
-768E (jiao3,jia3)
-768F (peng3)
-7690 (gao1)
-7691 (ai2)
-7692 (e2)
-7693 (hao4)
-7694 (han4)
-7695 (bi4)
-7696 (wan3,huan3)
-7697 (chou2)
-7698 (qian4)
-7699 (xi1)
-769A (ai2)
-769B (jiong3)
-769C (hao4)
-769D (huang3)
-769E (hao4)
-769F (ze2)
-76A0 (cui2)
-76A1 (hao4)
-76A2 (xiao3)
-76A3 (ye4)
-76A4 (po2)
-76A5 (hao4)
-76A6 (jiao3)
-76A7 (ai4)
-76A8 (xing1)
-76A9 (huang4)
-76AA (li4)
-76AB (piao3)
-76AC (he4)
-76AD (jiao4)
-76AE (pi2)
-76AF (gan3)
-76B0 (pao4)
-76B1 (zhou4)
-76B2 (jun1)
-76B3 (qiu2)
-76B4 (cun1)
-76B5 (que4)
-76B6 (zha1)
-76B7 (gu3)
-76B8 (jun1)
-76B9 (jun1)
-76BA (zhou4)
-76BB (zha1)
-76BC (gu3)
-76BD (zhan3)
-76BE (du2)
-76BF (min3)
-76C0 (qi3)
-76C1 (ying2)
-76C2 (yu2)
-76C3 (bei1)
-76C4 (zhao1)
-76C5 (zhong1)
-76C6 (pen2)
-76C7 (he2)
-76C8 (ying2)
-76C9 (he2)
-76CA (yi4)
-76CB (bo1)
-76CC (wan3)
-76CD (he2)
-76CE (ang4)
-76CF (zhan3)
-76D0 (yan2)
-76D1 (jian1,jian4)
-76D2 (he2)
-76D3 (yu1)
-76D4 (kui1)
-76D5 (fan4)
-76D6 (gai4,ge3)
-76D7 (dao4)
-76D8 (pan2)
-76D9 (fu3)
-76DA (qiu2)
-76DB (sheng4,cheng2)
-76DC (dao4)
-76DD (lu4)
-76DE (zhan3)
-76DF (meng2,ming2)
-76E0 (lu4)
-76E1 (jin4,jin3)
-76E2 (xu4)
-76E3 (jian1,jian4)
-76E4 (pan2)
-76E5 (guan4)
-76E6 (an1)
-76E7 (lu2)
-76E8 (xu3)
-76E9 (zhou1)
-76EA (dang4)
-76EB (an1)
-76EC (gu3)
-76ED (li4)
-76EE (mu4)
-76EF (ding1)
-76F0 (gan3)
-76F1 (xu1)
-76F2 (mang2)
-76F3 (mang2)
-76F4 (zhi2)
-76F5 (qi4)
-76F6 (wan3)
-76F7 (tian2)
-76F8 (xiang1,xiang4)
-76F9 (dun3)
-76FA (xin1)
-76FB (xi1)
-76FC (pan4)
-76FD (feng1)
-76FE (dun4,shun3)
-76FF (min2)
-7700 (ming2)
-7701 (sheng3,xing3)
-7702 (shi4)
-7703 (yun2)
-7704 (mian3,mian4)
-7705 (pan1)
-7706 (fang3)
-7707 (miao3)
-7708 (dan1)
-7709 (mei2)
-770A (mao4)
-770B (kan4,kan1)
-770C (xian4)
-770D (kou1)
-770E (shi4)
-770F (yang1)
-7710 (zheng1)
-7711 (yao3)
-7712 (shen1)
-7713 (huo4)
-7714 (da4)
-7715 (zhen3)
-7716 (kuang4)
-7717 (ju1)
-7718 (shen4)
-7719 (yi2)
-771A (sheng3)
-771B (mei4)
-771C (mo4)
-771D (zhu3)
-771E (zhen1)
-771F (zhen1)
-7720 (mian2)
-7721 (di1)
-7722 (yuan1)
-7723 (die2)
-7724 (yi2)
-7725 (zi4)
-7726 (zi4)
-7727 (chao3)
-7728 (zha3)
-7729 (xuan4)
-772A (bing3)
-772B (mi3)
-772C (long2)
-772D (sui1)
-772E (tong2)
-772F (mi1,mi2)
-7730 (die2)
-7731 (yi2)
-7732 (er4)
-7733 (ming3)
-7734 (xuan4)
-7735 (chi1)
-7736 (kuang4)
-7737 (juan4)
-7738 (mou2)
-7739 (zhen4)
-773A (tiao4)
-773B (yang2)
-773C (yan3)
-773D (mo4)
-773E (zhong4)
-773F (mai4)
-7740 (zhe5,zhuo2,zhao2,zhao1)
-7741 (zheng1)
-7742 (mei2)
-7743 (suo1)
-7744 (shao4)
-7745 (han4)
-7746 (huan3)
-7747 (di4)
-7748 (cheng3)
-7749 (cuo1)
-774A (juan4)
-774B (e2)
-774C (wan3)
-774D (xian4)
-774E (xi1)
-774F (kun4)
-7750 (lai4)
-7751 (jian3)
-7752 (shan3)
-7753 (tian3)
-7754 (hun3)
-7755 (wan3)
-7756 (ling2)
-7757 (shi4)
-7758 (qiong2)
-7759 (lie4)
-775A (ya2,ai2)
-775B (jing1)
-775C (zheng1)
-775D (li2)
-775E (lai4)
-775F (sui4)
-7760 (juan4)
-7761 (shui4)
-7762 (sui1)
-7763 (du1)
-7764 (pi4)
-7765 (pi4,bi4)
-7766 (mu4)
-7767 (hun1)
-7768 (ni4)
-7769 (lu4)
-776A (gao1)
-776B (jie2)
-776C (cai3)
-776D (zhou3)
-776E (yu2)
-776F (hun1)
-7770 (ma4)
-7771 (xia4)
-7772 (xing3)
-7773 (hui1)
-7774 (gun4)
-7775 (none0)
-7776 (chun3)
-7777 (jian1)
-7778 (mei4)
-7779 (du3)
-777A (hou2)
-777B (xuan1)
-777C (ti2)
-777D (kui2)
-777E (gao1)
-777F (rui4)
-7780 (mao4)
-7781 (xu4)
-7782 (fa1)
-7783 (wen1)
-7784 (miao2)
-7785 (chou3)
-7786 (kui4)
-7787 (mi1)
-7788 (weng3)
-7789 (kou4)
-778A (dang4)
-778B (chen1)
-778C (ke1)
-778D (sou3)
-778E (xia1)
-778F (qiong2)
-7790 (mao4)
-7791 (ming2)
-7792 (man2)
-7793 (shui4)
-7794 (ze2)
-7795 (zhang4)
-7796 (yi4)
-7797 (diao1)
-7798 (kou1)
-7799 (mo4)
-779A (shun4)
-779B (cong1)
-779C (lou2)
-779D (chi1)
-779E (man2)
-779F (piao3)
-77A0 (cheng1)
-77A1 (ji4)
-77A2 (meng2)
-77A3 (huan4)
-77A4 (run2)
-77A5 (pie1)
-77A6 (xi1)
-77A7 (qiao2,ya3)
-77A8 (pu1)
-77A9 (zhu3)
-77AA (deng4)
-77AB (shen3)
-77AC (shun4)
-77AD (liao4,liao3)
-77AE (che4)
-77AF (xian2)
-77B0 (kan4)
-77B1 (ye4)
-77B2 (xu4)
-77B3 (tong2)
-77B4 (wu2)
-77B5 (lin2)
-77B6 (kui4)
-77B7 (jian4)
-77B8 (ye4)
-77B9 (ai4)
-77BA (hui4)
-77BB (zhan1)
-77BC (jian3)
-77BD (gu3)
-77BE (zhao4)
-77BF (ju4,qu2,qu1)
-77C0 (wei2)
-77C1 (chou3)
-77C2 (ji4)
-77C3 (ning3)
-77C4 (xun1)
-77C5 (yao4)
-77C6 (huo4)
-77C7 (meng2)
-77C8 (mian2)
-77C9 (bin1,pin2)
-77CA (mian2)
-77CB (li4)
-77CC (guang4)
-77CD (jue2)
-77CE (xuan1)
-77CF (mian2)
-77D0 (huo4)
-77D1 (lu2)
-77D2 (meng2)
-77D3 (long2)
-77D4 (guan4)
-77D5 (man3)
-77D6 (xi3)
-77D7 (chu4)
-77D8 (tang3)
-77D9 (kan4)
-77DA (zhu3)
-77DB (mao2)
-77DC (jin1,qin2,guan1)
-77DD (lin2)
-77DE (yu4)
-77DF (shuo4)
-77E0 (ce4)
-77E1 (jue2)
-77E2 (shi3)
-77E3 (yi3)
-77E4 (shen3)
-77E5 (zhi1,zhi4)
-77E6 (hou2,hou4)
-77E7 (shen3)
-77E8 (ying3)
-77E9 (ju3,ju5)
-77EA (zhou1)
-77EB (jiao3,jia3,jiao2)
-77EC (cuo2)
-77ED (duan3)
-77EE (ai3)
-77EF (jiao3,jia3,jiao2)
-77F0 (zeng1)
-77F1 (huo4)
-77F2 (bai3,bai4,pai3)
-77F3 (shi2,dan4)
-77F4 (ding4)
-77F5 (qi4)
-77F6 (ji1)
-77F7 (zi3)
-77F8 (gan1)
-77F9 (wu4)
-77FA (tuo1)
-77FB (ku1)
-77FC (qiang1)
-77FD (xi1)
-77FE (fan2)
-77FF (kuang4)
-7800 (dang4)
-7801 (ma3)
-7802 (sha1)
-7803 (dan1)
-7804 (jue2)
-7805 (li4)
-7806 (fu1)
-7807 (min2)
-7808 (nuo3)
-7809 (hua1,xu1)
-780A (kang4)
-780B (zhi3)
-780C (qi4,qie4)
-780D (kan3)
-780E (jie4)
-780F (fen1)
-7810 (e4)
-7811 (ya4)
-7812 (pi1)
-7813 (zhe2)
-7814 (yan2,yan4)
-7815 (sui4)
-7816 (zhuan1)
-7817 (che1)
-7818 (dun4)
-7819 (pan1)
-781A (yan4)
-781B (none0)
-781C (feng1)
-781D (fa3)
-781E (mo4)
-781F (zha3,zuo4)
-7820 (qu1)
-7821 (yu4)
-7822 (ke1)
-7823 (tuo2)
-7824 (tuo2)
-7825 (di3)
-7826 (zhai4)
-7827 (zhen1)
-7828 (e4)
-7829 (fu2,fei4)
-782A (mu3)
-782B (zhu3)
-782C (la2,li4)
-782D (bian1)
-782E (nu3)
-782F (ping1)
-7830 (peng1)
-7831 (ling2)
-7832 (pao4)
-7833 (le4)
-7834 (po4)
-7835 (bo1)
-7836 (po4)
-7837 (shen1)
-7838 (za2)
-7839 (ai4)
-783A (li4)
-783B (long2)
-783C (tong2)
-783D (none0)
-783E (li4)
-783F (kuang4)
-7840 (chu3)
-7841 (keng1)
-7842 (quan2)
-7843 (zhu1)
-7844 (kuang1)
-7845 (gui1,huo4)
-7846 (e4)
-7847 (nao2)
-7848 (jia2)
-7849 (lu4)
-784A (wei3,kui4)
-784B (ai4)
-784C (luo4,ge4)
-784D (ken4)
-784E (xing2)
-784F (yan2)
-7850 (dong4,dong3)
-7851 (peng1)
-7852 (xi1)
-7853 (none0)
-7854 (hong2)
-7855 (shuo4)
-7856 (xia2)
-7857 (qiao1)
-7858 (none0)
-7859 (wei4)
-785A (qiao2)
-785B (none0)
-785C (keng1)
-785D (xiao1)
-785E (que4)
-785F (chan4)
-7860 (lang3)
-7861 (hong1)
-7862 (yu2)
-7863 (xiao1)
-7864 (xia2)
-7865 (mang3)
-7866 (long4)
-7867 (none0)
-7868 (che1)
-7869 (che4)
-786A (wo4)
-786B (liu2)
-786C (ying4)
-786D (mang2)
-786E (que4)
-786F (yan4)
-7870 (cuo3)
-7871 (kun3)
-7872 (yu4)
-7873 (none0)
-7874 (none0)
-7875 (lu3)
-7876 (chen3)
-7877 (jian3)
-7878 (none0)
-7879 (song1)
-787A (zhuo2)
-787B (keng1)
-787C (peng2)
-787D (yan3)
-787E (zhui4)
-787F (kong1)
-7880 (ceng2)
-7881 (qi2)
-7882 (zong4)
-7883 (qing4)
-7884 (lin2)
-7885 (jun1)
-7886 (bo1)
-7887 (ding4)
-7888 (min2)
-7889 (diao1)
-788A (jian1)
-788B (he4)
-788C (liu4,lu4)
-788D (ai4)
-788E (sui4)
-788F (que4)
-7890 (ling2)
-7891 (bei1)
-7892 (yin2)
-7893 (dui4)
-7894 (wu3)
-7895 (qi2)
-7896 (lun2)
-7897 (wan3)
-7898 (dian3)
-7899 (gang1)
-789A (bei4)
-789B (qi4)
-789C (chen3)
-789D (ruan3)
-789E (yan2)
-789F (die2)
-78A0 (ding4)
-78A1 (zhou5,zhou2)
-78A2 (tuo2)
-78A3 (jie2)
-78A4 (ying1)
-78A5 (bian3)
-78A6 (ke4)
-78A7 (bi4)
-78A8 (wei1)
-78A9 (shuo4,shi2)
-78AA (zhen1)
-78AB (duan4)
-78AC (xia2)
-78AD (dang4)
-78AE (ti2)
-78AF (nao3)
-78B0 (peng4)
-78B1 (jian3)
-78B2 (di4)
-78B3 (tan4)
-78B4 (cha2,cha1)
-78B5 (none0)
-78B6 (qi4)
-78B7 (none0)
-78B8 (feng1)
-78B9 (xuan4)
-78BA (que4)
-78BB (que4)
-78BC (ma3)
-78BD (gong1)
-78BE (nian3)
-78BF (su4)
-78C0 (e2)
-78C1 (ci2)
-78C2 (liu4)
-78C3 (si1)
-78C4 (tang2)
-78C5 (bang4,pang2,pang1)
-78C6 (hua2)
-78C7 (pi1)
-78C8 (wei3)
-78C9 (sang3)
-78CA (lei3)
-78CB (cuo1)
-78CC (tian2)
-78CD (xia2)
-78CE (xi1)
-78CF (lian2)
-78D0 (pan2)
-78D1 (wei4)
-78D2 (yun3)
-78D3 (dui1)
-78D4 (zhe2)
-78D5 (ke1)
-78D6 (la2)
-78D7 (none0)
-78D8 (qing4)
-78D9 (gun3)
-78DA (zhuan1)
-78DB (chan2)
-78DC (qi4)
-78DD (ao2)
-78DE (peng1)
-78DF (lu4)
-78E0 (lu3)
-78E1 (kan4)
-78E2 (qiang3)
-78E3 (chen3)
-78E4 (yin3)
-78E5 (lei3)
-78E6 (biao1)
-78E7 (qi4)
-78E8 (mo2,mo4)
-78E9 (qi1)
-78EA (cui1)
-78EB (zong1)
-78EC (qing4)
-78ED (chuo4)
-78EE (none0)
-78EF (ji1)
-78F0 (shan4)
-78F1 (lao2)
-78F2 (qu2)
-78F3 (zeng1)
-78F4 (deng4)
-78F5 (jian4)
-78F6 (xi4)
-78F7 (lin2)
-78F8 (ding4)
-78F9 (dian4)
-78FA (huang2)
-78FB (pan2)
-78FC (za2)
-78FD (qiao1)
-78FE (di1)
-78FF (li4)
-7900 (jian4)
-7901 (jiao1)
-7902 (xi1)
-7903 (zhang3)
-7904 (qiao2)
-7905 (dun1)
-7906 (jian3)
-7907 (yu4)
-7908 (zhui4)
-7909 (he2)
-790A (huo4)
-790B (zhai2)
-790C (lei2)
-790D (ke3)
-790E (chu3)
-790F (ji2)
-7910 (que4)
-7911 (dang4)
-7912 (wo4,yi3)
-7913 (jiang1)
-7914 (pi4)
-7915 (pi1)
-7916 (yu4)
-7917 (pin1)
-7918 (qi4)
-7919 (ai4)
-791A (ke1)
-791B (jian1)
-791C (yu4)
-791D (ruan3)
-791E (meng2)
-791F (pao4)
-7920 (zi1)
-7921 (bo2)
-7922 (none0)
-7923 (mie4)
-7924 (ca3)
-7925 (xian2)
-7926 (kuang4,gong3)
-7927 (lei3)
-7928 (lei3)
-7929 (zhi4)
-792A (li4)
-792B (li4)
-792C (fan2)
-792D (que4)
-792E (pao4)
-792F (ying1)
-7930 (li4)
-7931 (long2)
-7932 (long2)
-7933 (mo4)
-7934 (bo2)
-7935 (shuang1)
-7936 (guan4)
-7937 (lan2)
-7938 (zan3)
-7939 (yan2)
-793A (shi4)
-793B (shi4)
-793C (li3)
-793D (reng2)
-793E (she4)
-793F (yue4)
-7940 (si4)
-7941 (qi2)
-7942 (ta1)
-7943 (ma4)
-7944 (xie4)
-7945 (yao1)
-7946 (xian1)
-7947 (zhi3,qi2,zhi1)
-7948 (qi2)
-7949 (zhi3)
-794A (beng1)
-794B (shu1)
-794C (chong1)
-794D (none0)
-794E (yi1)
-794F (shi2)
-7950 (you4)
-7951 (zhi4)
-7952 (tiao2)
-7953 (fu2)
-7954 (fu4)
-7955 (mi4)
-7956 (zu3)
-7957 (zhi1)
-7958 (suan4)
-7959 (mei4)
-795A (zuo4)
-795B (qu1)
-795C (hu4)
-795D (zhu4)
-795E (shen2)
-795F (sui4)
-7960 (ci2)
-7961 (chai2)
-7962 (mi2,ni3)
-7963 (lu:3)
-7964 (yu3)
-7965 (xiang2)
-7966 (wu2)
-7967 (tiao1)
-7968 (piao4)
-7969 (zhu1)
-796A (gui3)
-796B (xia2)
-796C (zhi1)
-796D (ji4,zhai4)
-796E (gao4)
-796F (zhen1)
-7970 (gao4)
-7971 (shui4)
-7972 (jin4)
-7973 (zhen3)
-7974 (gai1,jie4)
-7975 (kun3)
-7976 (di4)
-7977 (dao3)
-7978 (huo4)
-7979 (tao2)
-797A (qi2)
-797B (gu4)
-797C (guan4)
-797D (zui4)
-797E (ling2)
-797F (lu4)
-7980 (bing3)
-7981 (jin4,jin1)
-7982 (dao3)
-7983 (zhi2)
-7984 (lu4)
-7985 (shan4,chan2)
-7986 (bei1)
-7987 (zhe3)
-7988 (hui1)
-7989 (you3)
-798A (xi4)
-798B (yin1)
-798C (zi1)
-798D (huo4)
-798E (zhen1)
-798F (fu2)
-7990 (yuan4)
-7991 (wu2)
-7992 (xian3)
-7993 (yang2)
-7994 (ti2)
-7995 (yi1)
-7996 (mei2)
-7997 (si1)
-7998 (di4)
-7999 (none0)
-799A (zhuo2)
-799B (zhen1)
-799C (yong3)
-799D (ji4)
-799E (gao4)
-799F (tang2)
-79A0 (chi3)
-79A1 (ma4)
-79A2 (ta1)
-79A3 (none0)
-79A4 (xuan1)
-79A5 (qi2)
-79A6 (yu4)
-79A7 (xi3)
-79A8 (ji1)
-79A9 (si4)
-79AA (chan2,shan4)
-79AB (xuan1)
-79AC (hui4)
-79AD (sui4)
-79AE (li3)
-79AF (nong2)
-79B0 (ni3,mi2)
-79B1 (dao3)
-79B2 (li4)
-79B3 (rang2,rang3)
-79B4 (yue4)
-79B5 (ti2)
-79B6 (zan3)
-79B7 (lei4)
-79B8 (rou2)
-79B9 (yu3)
-79BA (yu2,yu4)
-79BB (li2)
-79BC (xie4)
-79BD (qin2)
-79BE (he2)
-79BF (tu1)
-79C0 (xiu4)
-79C1 (si1)
-79C2 (ren2)
-79C3 (tu1)
-79C4 (zi3)
-79C5 (cha2)
-79C6 (gan3)
-79C7 (yi4)
-79C8 (xian1)
-79C9 (bing3)
-79CA (nian2)
-79CB (qiu1)
-79CC (qiu1)
-79CD (zhong3,chong2,zhong4)
-79CE (fen4)
-79CF (hao4)
-79D0 (yun2)
-79D1 (ke1)
-79D2 (miao3)
-79D3 (zhi1)
-79D4 (jing1)
-79D5 (bi3)
-79D6 (zhi1)
-79D7 (yu4)
-79D8 (mi4,bi4,lin2)
-79D9 (ku4)
-79DA (ban4)
-79DB (pi1)
-79DC (ni2)
-79DD (li4)
-79DE (you2)
-79DF (zu1)
-79E0 (pi1)
-79E1 (ba2)
-79E2 (ling2)
-79E3 (mo4)
-79E4 (cheng4,chen4,cheng1)
-79E5 (nian2)
-79E6 (qin2)
-79E7 (yang1)
-79E8 (zuo2)
-79E9 (zhi4)
-79EA (zhi1)
-79EB (shu2)
-79EC (ju4)
-79ED (zi3)
-79EE (tai2)
-79EF (ji1)
-79F0 (cheng1,chen4,cheng4)
-79F1 (tong2)
-79F2 (zhi4)
-79F3 (huo2)
-79F4 (he2)
-79F5 (yin1)
-79F6 (zi1)
-79F7 (zhi2)
-79F8 (jie1)
-79F9 (ren3)
-79FA (du4)
-79FB (yi2)
-79FC (zhu4)
-79FD (hui4)
-79FE (nong2)
-79FF (fu3)
-7A00 (xi1)
-7A01 (kao3)
-7A02 (lang2)
-7A03 (fu1,fu2)
-7A04 (ze4)
-7A05 (shui4)
-7A06 (lu:3)
-7A07 (kun3)
-7A08 (gan3)
-7A09 (jing1)
-7A0A (ti2)
-7A0B (cheng2)
-7A0C (tu2)
-7A0D (shao1,shao4)
-7A0E (shui4)
-7A0F (ya4)
-7A10 (lun3)
-7A11 (lu4)
-7A12 (gu4)
-7A13 (zuo2)
-7A14 (ren3)
-7A15 (zhun4)
-7A16 (bang4)
-7A17 (bai4,bi4)
-7A18 (ji1,qi2)
-7A19 (zhi2)
-7A1A (zhi4)
-7A1B (kun3)
-7A1C (leng2)
-7A1D (peng2)
-7A1E (ke1)
-7A1F (bing3)
-7A20 (chou2)
-7A21 (zui4)
-7A22 (yu4)
-7A23 (su1)
-7A24 (none0)
-7A25 (none0)
-7A26 (yi1)
-7A27 (xi4)
-7A28 (bian1)
-7A29 (ji4)
-7A2A (fu4)
-7A2B (bi1)
-7A2C (nuo4)
-7A2D (jie1)
-7A2E (zhong3,chong2,zhong4)
-7A2F (zong1)
-7A30 (xu1)
-7A31 (cheng1,chen4,cheng4)
-7A32 (dao4)
-7A33 (wen3)
-7A34 (lian2)
-7A35 (zi1)
-7A36 (yu4)
-7A37 (ji4)
-7A38 (xu4)
-7A39 (zhen3)
-7A3A (zhi4)
-7A3B (dao4)
-7A3C (jia4)
-7A3D (ji1,qi3)
-7A3E (gao3)
-7A3F (gao3)
-7A40 (gu3)
-7A41 (rong2)
-7A42 (sui4)
-7A43 (none0)
-7A44 (ji4)
-7A45 (kang1)
-7A46 (mu4)
-7A47 (shan1)
-7A48 (men2)
-7A49 (zhi4)
-7A4A (ji4)
-7A4B (lu4)
-7A4C (su1,wei4)
-7A4D (ji1)
-7A4E (ying3)
-7A4F (wen3)
-7A50 (qiu1)
-7A51 (se4)
-7A52 (none0)
-7A53 (yi4)
-7A54 (huang2)
-7A55 (qie4)
-7A56 (ji3)
-7A57 (sui4)
-7A58 (xiao1)
-7A59 (pu2)
-7A5A (jiao1)
-7A5B (zhuo1)
-7A5C (tong2)
-7A5D (none0)
-7A5E (lu:3)
-7A5F (sui4)
-7A60 (nong2)
-7A61 (se4)
-7A62 (hui4)
-7A63 (rang2)
-7A64 (nuo4)
-7A65 (yu4)
-7A66 (none0)
-7A67 (ji4)
-7A68 (tui2)
-7A69 (wen3)
-7A6A (cheng1,chen4,cheng4)
-7A6B (huo4)
-7A6C (gong3)
-7A6D (lu:3)
-7A6E (biao1)
-7A6F (none0)
-7A70 (rang2)
-7A71 (jue2)
-7A72 (li2)
-7A73 (zan4)
-7A74 (xue2,xue4)
-7A75 (wa1)
-7A76 (jiu1,jiu4)
-7A77 (qiong2)
-7A78 (xi1)
-7A79 (qiong2,qiong1)
-7A7A (kong1,kong4)
-7A7B (yu1)
-7A7C (sen1)
-7A7D (jing3)
-7A7E (yao4)
-7A7F (chuan1)
-7A80 (zhun1)
-7A81 (tu1,tu2)
-7A82 (lao2)
-7A83 (qie4)
-7A84 (zhai3,ze2)
-7A85 (yao3)
-7A86 (bian3)
-7A87 (bao2)
-7A88 (yao3)
-7A89 (bing3)
-7A8A (yu3)
-7A8B (zhu2)
-7A8C (jiao4)
-7A8D (qiao4)
-7A8E (diao4)
-7A8F (wu1)
-7A90 (gui1)
-7A91 (yao2)
-7A92 (zhi4)
-7A93 (chuan1)
-7A94 (yao3)
-7A95 (tiao3)
-7A96 (jiao4)
-7A97 (chuang1)
-7A98 (jiong3,jun3)
-7A99 (xiao1)
-7A9A (cheng2)
-7A9B (kou4)
-7A9C (cuan4)
-7A9D (wo1)
-7A9E (dan4)
-7A9F (ku1)
-7AA0 (ke1)
-7AA1 (zhui4)
-7AA2 (xu4)
-7AA3 (su1)
-7AA4 (none0)
-7AA5 (kui1)
-7AA6 (dou4)
-7AA7 (none0)
-7AA8 (yin4,xun1)
-7AA9 (wo1)
-7AAA (wa1)
-7AAB (ya4)
-7AAC (yu2)
-7AAD (ju4)
-7AAE (qiong2)
-7AAF (yao2)
-7AB0 (yao2)
-7AB1 (tiao4)
-7AB2 (liao4)
-7AB3 (yu3)
-7AB4 (tian2)
-7AB5 (diao4)
-7AB6 (ju4)
-7AB7 (liao2)
-7AB8 (xi1)
-7AB9 (wu4)
-7ABA (kui1)
-7ABB (chuang1)
-7ABC (ju3)
-7ABD (none0)
-7ABE (kuan3)
-7ABF (long2)
-7AC0 (cheng1)
-7AC1 (cui4)
-7AC2 (piao2)
-7AC3 (zao4)
-7AC4 (cuan4)
-7AC5 (qiao4)
-7AC6 (qiong2)
-7AC7 (dou4)
-7AC8 (zao4)
-7AC9 (zao4)
-7ACA (qie4)
-7ACB (li4)
-7ACC (chu4)
-7ACD (shi2,gong1,sheng1)
-7ACE (fu4)
-7ACF (qian1,gong1,sheng1)
-7AD0 (chu4)
-7AD1 (hong2)
-7AD2 (qi2,ji1)
-7AD3 (qian1,fen1,zhi1,yi1,gong1,sheng1)
-7AD4 (gong1,sheng1)
-7AD5 (shi2,fen1,zhi1,yi1,gong1,sheng1)
-7AD6 (shu4)
-7AD7 (miao4)
-7AD8 (ju3)
-7AD9 (zhan4)
-7ADA (zhu4)
-7ADB (ling2)
-7ADC (long2)
-7ADD (bing4,bing1)
-7ADE (jing4)
-7ADF (jing4)
-7AE0 (zhang1)
-7AE1 (yi1,gong1,sheng1,bai3,bei4,si4)
-7AE2 (si4,qi2)
-7AE3 (jun4)
-7AE4 (hong2)
-7AE5 (tong2)
-7AE6 (song3)
-7AE7 (jing4)
-7AE8 (diao4)
-7AE9 (yi4)
-7AEA (shu4)
-7AEB (jing4)
-7AEC (qu3)
-7AED (jie2)
-7AEE (ping2)
-7AEF (duan1)
-7AF0 (shao2)
-7AF1 (zhuan3)
-7AF2 (ceng2)
-7AF3 (deng1)
-7AF4 (cun1)
-7AF5 (huai1)
-7AF6 (jing4)
-7AF7 (kan4)
-7AF8 (jing4)
-7AF9 (zhu2)
-7AFA (zhu2)
-7AFB (le4)
-7AFC (peng2)
-7AFD (yu2)
-7AFE (chi2)
-7AFF (gan1)
-7B00 (mang2)
-7B01 (zhu2)
-7B02 (none0)
-7B03 (du3)
-7B04 (ji1)
-7B05 (xiao2)
-7B06 (ba1)
-7B07 (suan4)
-7B08 (ji2)
-7B09 (zhen3)
-7B0A (zhao4)
-7B0B (sun3)
-7B0C (ya2)
-7B0D (zhui4)
-7B0E (yuan2)
-7B0F (hu4)
-7B10 (gang1)
-7B11 (xiao4)
-7B12 (cen2)
-7B13 (pi2)
-7B14 (bi3)
-7B15 (jian3)
-7B16 (yi3)
-7B17 (dong1)
-7B18 (shan1)
-7B19 (sheng1)
-7B1A (xia2)
-7B1B (di2)
-7B1C (zhu2)
-7B1D (na4)
-7B1E (chi1)
-7B1F (gu1)
-7B20 (li4)
-7B21 (qie4)
-7B22 (min3)
-7B23 (bao1)
-7B24 (tiao2)
-7B25 (si4)
-7B26 (fu2)
-7B27 (ce4)
-7B28 (ben4)
-7B29 (fa2)
-7B2A (da2)
-7B2B (zi3)
-7B2C (di4)
-7B2D (ling2)
-7B2E (ze2,zuo2)
-7B2F (nu2)
-7B30 (fu2)
-7B31 (gou3)
-7B32 (fan2)
-7B33 (jia1)
-7B34 (ge3)
-7B35 (fan4)
-7B36 (shi3)
-7B37 (mao3)
-7B38 (po3)
-7B39 (none0)
-7B3A (jian1)
-7B3B (qiong2)
-7B3C (long3,long2)
-7B3D (none0)
-7B3E (bian1)
-7B3F (luo4)
-7B40 (gui4)
-7B41 (qu3,qu1)
-7B42 (chi2)
-7B43 (yin1)
-7B44 (yao4)
-7B45 (xian3)
-7B46 (bi3)
-7B47 (qiong2)
-7B48 (gua1)
-7B49 (deng3)
-7B4A (jiao3)
-7B4B (jin1)
-7B4C (quan2)
-7B4D (sun3)
-7B4E (ru2)
-7B4F (fa2)
-7B50 (kuang1)
-7B51 (zhu4,zhu2)
-7B52 (tong3)
-7B53 (ji1)
-7B54 (da2,da1)
-7B55 (hang2)
-7B56 (ce4)
-7B57 (zhong4)
-7B58 (kou4)
-7B59 (lai2)
-7B5A (bi4)
-7B5B (shai1)
-7B5C (dang1)
-7B5D (zheng1)
-7B5E (ce4)
-7B5F (fu1)
-7B60 (yun2,jun1)
-7B61 (tu2)
-7B62 (pa2)
-7B63 (li4)
-7B64 (lang2)
-7B65 (ju3)
-7B66 (guan3)
-7B67 (jian3)
-7B68 (han2)
-7B69 (tong3)
-7B6A (xia2)
-7B6B (zhi4)
-7B6C (cheng2)
-7B6D (suan4)
-7B6E (shi4)
-7B6F (zhu4)
-7B70 (zuo2)
-7B71 (xiao3)
-7B72 (shao1)
-7B73 (ting2)
-7B74 (jia2,ce4)
-7B75 (yan2)
-7B76 (gao3)
-7B77 (kuai4)
-7B78 (gan1)
-7B79 (chou2)
-7B7A (kuang1)
-7B7B (gang4)
-7B7C (yun2)
-7B7D (none0)
-7B7E (qian1)
-7B7F (xiao3)
-7B80 (jian3)
-7B81 (pu2)
-7B82 (lai2)
-7B83 (zou1)
-7B84 (bi4)
-7B85 (bi4)
-7B86 (bi4)
-7B87 (ge4)
-7B88 (chi2)
-7B89 (guai3)
-7B8A (yu1)
-7B8B (jian1)
-7B8C (zhao4)
-7B8D (gu1)
-7B8E (chi2)
-7B8F (zheng1)
-7B90 (qing4)
-7B91 (sha4)
-7B92 (zhou3)
-7B93 (lu4)
-7B94 (bo2)
-7B95 (ji1,ji5)
-7B96 (lin2)
-7B97 (suan4)
-7B98 (jun4)
-7B99 (fu1)
-7B9A (zha2)
-7B9B (gu1)
-7B9C (kong1)
-7B9D (qian2)
-7B9E (qian1)
-7B9F (jun4,jun1)
-7BA0 (chui2)
-7BA1 (guan3)
-7BA2 (yuan1)
-7BA3 (ce4)
-7BA4 (ju2)
-7BA5 (bo3)
-7BA6 (ze2)
-7BA7 (qie4)
-7BA8 (tuo4)
-7BA9 (luo2)
-7BAA (dan1)
-7BAB (xiao1)
-7BAC (ruo4)
-7BAD (jian4)
-7BAE (none0)
-7BAF (bian1)
-7BB0 (sun3)
-7BB1 (xiang1)
-7BB2 (xian3)
-7BB3 (ping2)
-7BB4 (zhen1)
-7BB5 (sheng3)
-7BB6 (hu2)
-7BB7 (shi1,yi2)
-7BB8 (zhu4)
-7BB9 (yue1)
-7BBA (chun1)
-7BBB (fu1)
-7BBC (wu1)
-7BBD (dong3)
-7BBE (shuo4)
-7BBF (ji2)
-7BC0 (jie2,jie1)
-7BC1 (huang2)
-7BC2 (xing1)
-7BC3 (mei2)
-7BC4 (fan4)
-7BC5 (chuan2)
-7BC6 (zhuan4)
-7BC7 (pian1)
-7BC8 (feng1)
-7BC9 (zhu2,zhu4)
-7BCA (hong2)
-7BCB (qie4)
-7BCC (hou2)
-7BCD (qiu1)
-7BCE (miao3)
-7BCF (qian4)
-7BD0 (none0)
-7BD1 (kui4)
-7BD2 (none0)
-7BD3 (lou3)
-7BD4 (yun2)
-7BD5 (he2)
-7BD6 (tang2)
-7BD7 (yue4)
-7BD8 (chou1)
-7BD9 (gao1)
-7BDA (fei3)
-7BDB (ruo4)
-7BDC (zheng1)
-7BDD (gou1)
-7BDE (nie4)
-7BDF (qian4)
-7BE0 (xiao3)
-7BE1 (cuan4)
-7BE2 (gong1)
-7BE3 (pang2)
-7BE4 (du3)
-7BE5 (li4)
-7BE6 (bi4)
-7BE7 (zhuo2)
-7BE8 (chu2)
-7BE9 (shai1)
-7BEA (chi2)
-7BEB (zhu2)
-7BEC (qiang1)
-7BED (long2,long3)
-7BEE (lan2)
-7BEF (jian1)
-7BF0 (bu4)
-7BF1 (li2)
-7BF2 (hui4)
-7BF3 (bi4)
-7BF4 (di2)
-7BF5 (cong1)
-7BF6 (yan1)
-7BF7 (peng2)
-7BF8 (sen1)
-7BF9 (cuan4)
-7BFA (pai2)
-7BFB (piao4)
-7BFC (dou1)
-7BFD (yu3)
-7BFE (mie4)
-7BFF (zhuan1)
-7C00 (ze2,kui4)
-7C01 (xi3)
-7C02 (guo2)
-7C03 (yi2)
-7C04 (hu4)
-7C05 (chan3)
-7C06 (kou4)
-7C07 (cu4)
-7C08 (ping2)
-7C09 (zao4)
-7C0A (ji1)
-7C0B (gui3)
-7C0C (su4)
-7C0D (lou3)
-7C0E (zha4)
-7C0F (lu4)
-7C10 (nian3)
-7C11 (suo1)
-7C12 (cuan4)
-7C13 (none0)
-7C14 (suo1)
-7C15 (le4)
-7C16 (duan4)
-7C17 (liang2)
-7C18 (xiao1)
-7C19 (bo2)
-7C1A (mi4)
-7C1B (shai1)
-7C1C (dang4)
-7C1D (liao2)
-7C1E (dan1)
-7C1F (dian4)
-7C20 (fu3)
-7C21 (jian3)
-7C22 (min3)
-7C23 (kui4)
-7C24 (dai4)
-7C25 (qiao2)
-7C26 (deng1)
-7C27 (huang2)
-7C28 (sun3)
-7C29 (lao2)
-7C2A (zan1)
-7C2B (xiao1)
-7C2C (lu4)
-7C2D (shi4)
-7C2E (zan1)
-7C2F (none0)
-7C30 (pai2)
-7C31 (qi2)
-7C32 (pai2)
-7C33 (gan4)
-7C34 (ju4)
-7C35 (du4)
-7C36 (lu4)
-7C37 (yan2)
-7C38 (bo4,bo3)
-7C39 (dang1)
-7C3A (sai4)
-7C3B (ke1)
-7C3C (gou4)
-7C3D (qian1)
-7C3E (lian2)
-7C3F (bu4)
-7C40 (zhou4)
-7C41 (lai4)
-7C42 (none0)
-7C43 (lan2)
-7C44 (kui4)
-7C45 (yu2)
-7C46 (yue4)
-7C47 (hao2)
-7C48 (zhen1)
-7C49 (tai2)
-7C4A (ti4)
-7C4B (mi2)
-7C4C (chou2)
-7C4D (ji2)
-7C4E (none0)
-7C4F (qi2)
-7C50 (teng2)
-7C51 (zhuan4)
-7C52 (zhou4)
-7C53 (fan1)
-7C54 (sou3)
-7C55 (zhou4)
-7C56 (qian1)
-7C57 (kuo4)
-7C58 (teng2)
-7C59 (lu4)
-7C5A (lu2)
-7C5B (jian1)
-7C5C (tuo4)
-7C5D (ying2)
-7C5E (yu4)
-7C5F (lai4)
-7C60 (long2,long3)
-7C61 (none0)
-7C62 (lian2)
-7C63 (lan2)
-7C64 (qian1)
-7C65 (yue4)
-7C66 (zhong1)
-7C67 (qu2)
-7C68 (lian2)
-7C69 (bian1)
-7C6A (duan4)
-7C6B (zuan3)
-7C6C (li2)
-7C6D (shai1)
-7C6E (luo2)
-7C6F (ying2)
-7C70 (yue4)
-7C71 (zhuo2)
-7C72 (xu1,yu1,yu4)
-7C73 (mi3)
-7C74 (di2)
-7C75 (fan2)
-7C76 (shen1)
-7C77 (zhe2)
-7C78 (shen1)
-7C79 (nu:3)
-7C7A (xie2)
-7C7B (lei4)
-7C7C (xian1)
-7C7D (zi3)
-7C7E (ni2)
-7C7F (cun4)
-7C80 (zhang4)
-7C81 (qian1)
-7C82 (none0)
-7C83 (bi3)
-7C84 (ban3)
-7C85 (wu4)
-7C86 (sha1)
-7C87 (kang1)
-7C88 (rou3)
-7C89 (fen3)
-7C8A (bi4)
-7C8B (cui4,sui4)
-7C8C (yin3)
-7C8D (li2)
-7C8E (chi3)
-7C8F (tai4)
-7C90 (none0)
-7C91 (ba1)
-7C92 (li4)
-7C93 (gan1)
-7C94 (ju4)
-7C95 (po4)
-7C96 (mo4)
-7C97 (cu1)
-7C98 (zhan1,nian2)
-7C99 (zhou4)
-7C9A (li2)
-7C9B (su4)
-7C9C (tiao4)
-7C9D (li4)
-7C9E (xi1)
-7C9F (su4)
-7CA0 (hong2)
-7CA1 (tong2)
-7CA2 (zi1,ci2)
-7CA3 (ce4)
-7CA4 (yue4)
-7CA5 (zhou1,yu4)
-7CA6 (lin2)
-7CA7 (zhuang1)
-7CA8 (bai3)
-7CA9 (none0)
-7CAA (fen4)
-7CAB (mian4)
-7CAC (qu1)
-7CAD (none0)
-7CAE (liang2)
-7CAF (xian4)
-7CB0 (fu1)
-7CB1 (liang2)
-7CB2 (can4)
-7CB3 (jing1,geng1)
-7CB4 (li3)
-7CB5 (yue4)
-7CB6 (lu4)
-7CB7 (ju2)
-7CB8 (qi2)
-7CB9 (cui4)
-7CBA (bai4)
-7CBB (chang2)
-7CBC (lin2)
-7CBD (zong4)
-7CBE (jing1)
-7CBF (guo3)
-7CC0 (none0)
-7CC1 (san3,shen1)
-7CC2 (san3,shen1)
-7CC3 (tang2)
-7CC4 (bian3)
-7CC5 (rou2,rou3)
-7CC6 (mian4)
-7CC7 (hou2)
-7CC8 (xu3)
-7CC9 (zong4)
-7CCA (hu2,hu1,hu4)
-7CCB (jian4)
-7CCC (zan1)
-7CCD (ci2)
-7CCE (li2)
-7CCF (xie4)
-7CD0 (fu1)
-7CD1 (nuo4)
-7CD2 (bei4)
-7CD3 (gu3,yu4)
-7CD4 (xiu3)
-7CD5 (gao1)
-7CD6 (tang2)
-7CD7 (qiu3)
-7CD8 (none0)
-7CD9 (cao1)
-7CDA (zhuang1)
-7CDB (tang2)
-7CDC (mi2,mei2)
-7CDD (san3,shen1)
-7CDE (fen4)
-7CDF (zao1)
-7CE0 (kang1)
-7CE1 (jiang4)
-7CE2 (mo2)
-7CE3 (san3)
-7CE4 (san3)
-7CE5 (nuo4)
-7CE6 (chi4)
-7CE7 (liang2)
-7CE8 (jiang4)
-7CE9 (kuai1)
-7CEA (bo2)
-7CEB (huan2)
-7CEC (shu3)
-7CED (zong4)
-7CEE (jian4)
-7CEF (nuo4)
-7CF0 (tuan2)
-7CF1 (nie4)
-7CF2 (li4)
-7CF3 (zuo4)
-7CF4 (di2)
-7CF5 (nie4)
-7CF6 (tiao4)
-7CF7 (lan2)
-7CF8 (mi4)
-7CF9 (mi4)
-7CFA (jiu1)
-7CFB (xi4,ji4)
-7CFC (gong1)
-7CFD (zheng3)
-7CFE (jiu1,jiu3)
-7CFF (you4)
-7D00 (ji4)
-7D01 (cha4)
-7D02 (zhou4)
-7D03 (xun2)
-7D04 (yue1,yao1)
-7D05 (hong2,gong1)
-7D06 (yu1)
-7D07 (he2,ge1)
-7D08 (wan2)
-7D09 (ren4)
-7D0A (wen3,wen4)
-7D0B (wen2,wen4)
-7D0C (qiu2)
-7D0D (na4)
-7D0E (zi1)
-7D0F (tou3)
-7D10 (niu3)
-7D11 (fou2)
-7D12 (jie4)
-7D13 (shu1)
-7D14 (chun2)
-7D15 (pi2,pi1)
-7D16 (yin3)
-7D17 (sha1)
-7D18 (hong2)
-7D19 (zhi3)
-7D1A (ji2)
-7D1B (fen1)
-7D1C (yun2)
-7D1D (ren2)
-7D1E (dan3)
-7D1F (jin1)
-7D20 (su4)
-7D21 (fang3)
-7D22 (suo3)
-7D23 (cui4)
-7D24 (jiu3)
-7D25 (zha2)
-7D26 (ba1)
-7D27 (jin3)
-7D28 (fu1)
-7D29 (zhi4)
-7D2A (qi1)
-7D2B (zi3)
-7D2C (chou2)
-7D2D (hong2)
-7D2E (zha2,za1)
-7D2F (lei3,lei4,lei2)
-7D30 (xi4)
-7D31 (fu2)
-7D32 (xie4)
-7D33 (shen1)
-7D34 (bei4)
-7D35 (zhu4)
-7D36 (qu3,qu1)
-7D37 (ling2)
-7D38 (zhu4)
-7D39 (shao4)
-7D3A (gan4)
-7D3B (yang1)
-7D3C (fu2)
-7D3D (tuo2)
-7D3E (zhen3)
-7D3F (dai4)
-7D40 (chu4)
-7D41 (shi1)
-7D42 (zhong1)
-7D43 (xian2)
-7D44 (zu3)
-7D45 (jiong3)
-7D46 (ban4)
-7D47 (ju4)
-7D48 (pa4)
-7D49 (shu4)
-7D4A (zui4)
-7D4B (kuang4)
-7D4C (jing1,jing4)
-7D4D (ren4)
-7D4E (heng4,hang2)
-7D4F (xie4)
-7D50 (jie2,jie1)
-7D51 (zhu1)
-7D52 (chou2)
-7D53 (gua4)
-7D54 (bai3)
-7D55 (jue2)
-7D56 (kuang4)
-7D57 (hu2)
-7D58 (ci4)
-7D59 (geng1)
-7D5A (geng1)
-7D5B (tao1)
-7D5C (xie2,jie2)
-7D5D (ku4)
-7D5E (jiao3,jia3)
-7D5F (quan1)
-7D60 (gai3)
-7D61 (luo4,lao4)
-7D62 (xuan4)
-7D63 (beng1,ping3)
-7D64 (xian4)
-7D65 (fu2)
-7D66 (gei3,ji3)
-7D67 (tong2)
-7D68 (rong2)
-7D69 (tiao4)
-7D6A (yin1)
-7D6B (lei3)
-7D6C (xie4)
-7D6D (quan4)
-7D6E (xu4)
-7D6F (hai4)
-7D70 (die2)
-7D71 (tong3)
-7D72 (si1)
-7D73 (jiang4)
-7D74 (xiang2)
-7D75 (hui4)
-7D76 (jue2)
-7D77 (zhi2)
-7D78 (jian3)
-7D79 (juan4)
-7D7A (chi1)
-7D7B (mian3)
-7D7C (zhen3)
-7D7D (lu:3)
-7D7E (cheng2)
-7D7F (qiu2)
-7D80 (shu1)
-7D81 (bang3)
-7D82 (tong3)
-7D83 (xiao1)
-7D84 (wan4)
-7D85 (qin1)
-7D86 (geng3)
-7D87 (xiu3)
-7D88 (ti2,di4,ti4)
-7D89 (xiu4)
-7D8A (xie2)
-7D8B (hong2)
-7D8C (xi4)
-7D8D (fu2)
-7D8E (ting2)
-7D8F (sui1,sui2)
-7D90 (dui4)
-7D91 (kun3)
-7D92 (fu1)
-7D93 (jing1,jing4)
-7D94 (hu4)
-7D95 (zhi1)
-7D96 (yan2)
-7D97 (jiong3)
-7D98 (feng2)
-7D99 (ji4)
-7D9A (xu4)
-7D9B (none0)
-7D9C (zong4,zeng4,zong1)
-7D9D (lin3)
-7D9E (duo3)
-7D9F (li4)
-7DA0 (lu:4)
-7DA1 (liang2)
-7DA2 (chou2)
-7DA3 (quan3)
-7DA4 (shao4)
-7DA5 (qi4)
-7DA6 (qi2)
-7DA7 (zhun3)
-7DA8 (qi2)
-7DA9 (wan3)
-7DAA (qian4)
-7DAB (xian4)
-7DAC (shou4)
-7DAD (wei2)
-7DAE (qi3,qing4,qing3)
-7DAF (tao2)
-7DB0 (wan3)
-7DB1 (gang1)
-7DB2 (wang3)
-7DB3 (beng1,beng3,beng4)
-7DB4 (zhui4)
-7DB5 (cai3)
-7DB6 (guo3)
-7DB7 (cui4)
-7DB8 (lun2,guan1)
-7DB9 (liu3)
-7DBA (qi3)
-7DBB (zhan4)
-7DBC (bei1)
-7DBD (chuo4)
-7DBE (ling2)
-7DBF (mian2)
-7DC0 (qi1)
-7DC1 (jie2)
-7DC2 (tan1)
-7DC3 (zong1)
-7DC4 (gun3)
-7DC5 (zou1)
-7DC6 (yi4)
-7DC7 (zi1)
-7DC8 (xing4)
-7DC9 (liang3)
-7DCA (jin3)
-7DCB (fei1)
-7DCC (rui2)
-7DCD (min2)
-7DCE (yu4)
-7DCF (zong3)
-7DD0 (fan2)
-7DD1 (lu:4)
-7DD2 (xu4)
-7DD3 (none0)
-7DD4 (shang4)
-7DD5 (none0)
-7DD6 (xu4)
-7DD7 (xiang1)
-7DD8 (jian1)
-7DD9 (ke4)
-7DDA (xian4)
-7DDB (ruan3)
-7DDC (mian2)
-7DDD (ji1,qi1,qi4)
-7DDE (duan4)
-7DDF (zhong4)
-7DE0 (di4)
-7DE1 (min2)
-7DE2 (miao2)
-7DE3 (yuan2)
-7DE4 (xie4)
-7DE5 (bao3)
-7DE6 (si1)
-7DE7 (qiu1)
-7DE8 (bian1)
-7DE9 (huan3)
-7DEA (geng1)
-7DEB (zong3)
-7DEC (mian3)
-7DED (wei4)
-7DEE (fu4)
-7DEF (wei3)
-7DF0 (yu2)
-7DF1 (gou1)
-7DF2 (miao3)
-7DF3 (jie2)
-7DF4 (lian4)
-7DF5 (zong1)
-7DF6 (bian4,pian2)
-7DF7 (yun4)
-7DF8 (yin1)
-7DF9 (ti2)
-7DFA (gua1)
-7DFB (zhi4)
-7DFC (yun1)
-7DFD (cheng1)
-7DFE (chan2)
-7DFF (dai4)
-7E00 (jia1)
-7E01 (yuan2)
-7E02 (zong3)
-7E03 (xu1)
-7E04 (sheng2)
-7E05 (none0)
-7E06 (geng1)
-7E07 (none0)
-7E08 (ying2)
-7E09 (jin4)
-7E0A (yi4)
-7E0B (zhui4)
-7E0C (ni4)
-7E0D (bang1)
-7E0E (gu3)
-7E0F (pan2)
-7E10 (zhou4)
-7E11 (jian1)
-7E12 (cuo3)
-7E13 (quan2)
-7E14 (shuang3)
-7E15 (yun1)
-7E16 (xia2)
-7E17 (shuai1)
-7E18 (xi1)
-7E19 (rong2)
-7E1A (tao1)
-7E1B (fu2)
-7E1C (yun2)
-7E1D (zhen3)
-7E1E (gao3)
-7E1F (ru4)
-7E20 (hu2)
-7E21 (zai3)
-7E22 (teng2)
-7E23 (xian4,xuan2)
-7E24 (su4)
-7E25 (zhen3)
-7E26 (zong4)
-7E27 (tao1)
-7E28 (huang3)
-7E29 (cai4)
-7E2A (bi4,bie4)
-7E2B (feng2,feng4)
-7E2C (cu4)
-7E2D (li2)
-7E2E (suo1,su4)
-7E2F (yin3)
-7E30 (xi3)
-7E31 (zong4,zong1)
-7E32 (lei2)
-7E33 (zhuan4)
-7E34 (qian4)
-7E35 (man4)
-7E36 (zhi2)
-7E37 (lu:3)
-7E38 (mo4)
-7E39 (piao3,piao1)
-7E3A (lian2)
-7E3B (mi2)
-7E3C (xuan4)
-7E3D (zong3)
-7E3E (ji1)
-7E3F (shan1)
-7E40 (sui4)
-7E41 (fan2,po2)
-7E42 (shuai4)
-7E43 (beng1)
-7E44 (yi1)
-7E45 (sao1)
-7E46 (mou2,miao4,miu4)
-7E47 (zhou4,yao2,you2)
-7E48 (qiang3)
-7E49 (hun2)
-7E4A (xian1)
-7E4B (xi4,ji4)
-7E4C (none0)
-7E4D (xiu4)
-7E4E (ran2)
-7E4F (xuan4)
-7E50 (hui4)
-7E51 (qiao1)
-7E52 (zeng1,zeng4)
-7E53 (zuo3)
-7E54 (zhi1)
-7E55 (shan4)
-7E56 (san3)
-7E57 (lin2)
-7E58 (yu4)
-7E59 (fan1)
-7E5A (liao2)
-7E5B (chuo4)
-7E5C (zun1)
-7E5D (jian4)
-7E5E (rao4,rao3)
-7E5F (chan3)
-7E60 (rui3)
-7E61 (xiu4)
-7E62 (hui4)
-7E63 (hua4)
-7E64 (zuan3)
-7E65 (xi1)
-7E66 (qiang3)
-7E67 (none0)
-7E68 (da2)
-7E69 (sheng2)
-7E6A (hui4)
-7E6B (xi4,ji4)
-7E6C (se4)
-7E6D (jian3)
-7E6E (jiang1)
-7E6F (huan2)
-7E70 (qiao1,zao3)
-7E71 (cong1)
-7E72 (jie4)
-7E73 (jiao3,jia3,zhuo2)
-7E74 (bo4)
-7E75 (chan2)
-7E76 (yi4)
-7E77 (nao2)
-7E78 (sui4)
-7E79 (yi4)
-7E7A (shai3)
-7E7B (xu1)
-7E7C (ji4)
-7E7D (bin1)
-7E7E (qian3)
-7E7F (jian4,kan3)
-7E80 (pu2)
-7E81 (xun1)
-7E82 (zuan3)
-7E83 (qi2)
-7E84 (peng2)
-7E85 (li4)
-7E86 (mo4)
-7E87 (lei4)
-7E88 (xie2)
-7E89 (zuan3)
-7E8A (kuang4)
-7E8B (you1)
-7E8C (xu4)
-7E8D (lei2)
-7E8E (xian1)
-7E8F (chan2)
-7E90 (none0)
-7E91 (lu2)
-7E92 (chan2)
-7E93 (ying1)
-7E94 (cai2)
-7E95 (xiang1)
-7E96 (xian1)
-7E97 (zui1)
-7E98 (zuan3)
-7E99 (luo4)
-7E9A (xi3)
-7E9B (dao4,du2)
-7E9C (lan4,lan3)
-7E9D (lei2)
-7E9E (lian4)
-7E9F (mi4)
-7EA0 (jiu1)
-7EA1 (yu1)
-7EA2 (hong2,gong1)
-7EA3 (zhou4)
-7EA4 (xian1,qian4)
-7EA5 (he2,ge1)
-7EA6 (yue1,yao1)
-7EA7 (ji2)
-7EA8 (wan2)
-7EA9 (kuang4)
-7EAA (ji4,ji3)
-7EAB (ren4)
-7EAC (wei3)
-7EAD (yun2)
-7EAE (hong2)
-7EAF (chun2)
-7EB0 (pi1)
-7EB1 (sha1)
-7EB2 (gang1)
-7EB3 (na4)
-7EB4 (ren4)
-7EB5 (zong4)
-7EB6 (lun2,guan1)
-7EB7 (fen1)
-7EB8 (zhi3)
-7EB9 (wen2,wen4)
-7EBA (fang3)
-7EBB (zhu4)
-7EBC (zhen4)
-7EBD (niu3)
-7EBE (shu1)
-7EBF (xian4)
-7EC0 (gan4)
-7EC1 (xie4)
-7EC2 (fu2)
-7EC3 (lian4)
-7EC4 (zu3)
-7EC5 (shen1)
-7EC6 (xi4)
-7EC7 (zhi1)
-7EC8 (zhong1)
-7EC9 (zhou4)
-7ECA (ban4)
-7ECB (fu2)
-7ECC (chu4)
-7ECD (shao4)
-7ECE (yi4)
-7ECF (jing1,jing4)
-7ED0 (dai4)
-7ED1 (bang3)
-7ED2 (rong2)
-7ED3 (jie2,jie1)
-7ED4 (ku4)
-7ED5 (rao3,rao4,rao5)
-7ED6 (die2)
-7ED7 (hang2)
-7ED8 (hui4)
-7ED9 (ji3,gei3)
-7EDA (xuan4)
-7EDB (jiang4)
-7EDC (luo4,lao4)
-7EDD (jue2)
-7EDE (jiao3,jia3)
-7EDF (tong3)
-7EE0 (geng3)
-7EE1 (xiao1)
-7EE2 (juan4)
-7EE3 (xiu4)
-7EE4 (xi4)
-7EE5 (sui2)
-7EE6 (tao1)
-7EE7 (ji4)
-7EE8 (ti2,ti4,di4)
-7EE9 (ji4,ji1)
-7EEA (xu4)
-7EEB (ling2)
-7EEC (yin1)
-7EED (xu4)
-7EEE (qi3)
-7EEF (fei1)
-7EF0 (chuo4,chao1,chuo5)
-7EF1 (shang4)
-7EF2 (gun3)
-7EF3 (sheng2)
-7EF4 (wei2)
-7EF5 (mian2)
-7EF6 (shou4)
-7EF7 (beng1,beng3,beng4)
-7EF8 (chou2)
-7EF9 (tao2)
-7EFA (liu3)
-7EFB (quan3)
-7EFC (zong1,zeng4)
-7EFD (zhan4)
-7EFE (wan3)
-7EFF (lu:4,lu4)
-7F00 (zhui4)
-7F01 (zi1)
-7F02 (ke4)
-7F03 (xiang1)
-7F04 (jian1)
-7F05 (mian3)
-7F06 (lan3)
-7F07 (ti2)
-7F08 (miao3)
-7F09 (ji1,qi1)
-7F0A (yun4)
-7F0B (hui4)
-7F0C (si1)
-7F0D (duo3)
-7F0E (duan4)
-7F0F (bian4,pian2)
-7F10 (xian4)
-7F11 (gou1)
-7F12 (zhui4)
-7F13 (huan3)
-7F14 (di4)
-7F15 (lu:3)
-7F16 (bian1)
-7F17 (min2)
-7F18 (yuan2)
-7F19 (jin4)
-7F1A (fu4)
-7F1B (ru4)
-7F1C (zhen3)
-7F1D (feng2,feng4)
-7F1E (cui1)
-7F1F (gao3)
-7F20 (chan2)
-7F21 (li2)
-7F22 (yi4)
-7F23 (jian1)
-7F24 (bin1)
-7F25 (piao1,piao3)
-7F26 (man4)
-7F27 (lei2)
-7F28 (ying1)
-7F29 (suo1,su4)
-7F2A (mou2,miao4,miu4)
-7F2B (sao1)
-7F2C (xie2)
-7F2D (liao2)
-7F2E (shan4)
-7F2F (zeng1,zeng4)
-7F30 (jiang1)
-7F31 (qian3)
-7F32 (qiao1,sao1,zao3)
-7F33 (huan2)
-7F34 (jiao3,zhuo2,jia3)
-7F35 (zuan3)
-7F36 (fou3)
-7F37 (xie4)
-7F38 (gang1)
-7F39 (fou3)
-7F3A (que1)
-7F3B (fou3)
-7F3C (que1)
-7F3D (bo1)
-7F3E (ping2)
-7F3F (hou4)
-7F40 (none0)
-7F41 (gang1)
-7F42 (ying1)
-7F43 (ying1)
-7F44 (qing4)
-7F45 (xia4)
-7F46 (guan4)
-7F47 (zun1)
-7F48 (tan2)
-7F49 (none0)
-7F4A (qing4)
-7F4B (weng4)
-7F4C (ying1)
-7F4D (lei2)
-7F4E (tan2)
-7F4F (lu2)
-7F50 (guan4)
-7F51 (wang3)
-7F52 (gang1)
-7F53 (wang3)
-7F54 (wang3)
-7F55 (han3)
-7F56 (none0)
-7F57 (luo2,luo1,luo5)
-7F58 (fu2,fou2)
-7F59 (mi2)
-7F5A (fa2)
-7F5B (gu1)
-7F5C (zhu3)
-7F5D (ju1)
-7F5E (mao2)
-7F5F (gu3)
-7F60 (min2)
-7F61 (gang1)
-7F62 (ba4,ba5)
-7F63 (gua4)
-7F64 (ti2)
-7F65 (juan4)
-7F66 (fu1)
-7F67 (lin2,sen1)
-7F68 (yan3)
-7F69 (zhao4)
-7F6A (zui4)
-7F6B (gua4)
-7F6C (zhuo2)
-7F6D (yu4)
-7F6E (zhi4)
-7F6F (an3)
-7F70 (fa2)
-7F71 (lan3)
-7F72 (shu3,shu4)
-7F73 (si1)
-7F74 (pi2)
-7F75 (ma4)
-7F76 (liu3)
-7F77 (ba4,ba5,pi2)
-7F78 (fa2)
-7F79 (li2)
-7F7A (chao1)
-7F7B (wei4)
-7F7C (bi4)
-7F7D (ji4)
-7F7E (zeng1)
-7F7F (tong2)
-7F80 (liu3)
-7F81 (ji1)
-7F82 (juan4)
-7F83 (mi4)
-7F84 (zhao4)
-7F85 (luo2,luo1)
-7F86 (pi2,biao1)
-7F87 (ji1)
-7F88 (ji1)
-7F89 (luan2)
-7F8A (yang2)
-7F8B (mie1)
-7F8C (qiang1)
-7F8D (ta4)
-7F8E (mei3)
-7F8F (yang3)
-7F90 (you3)
-7F91 (you3)
-7F92 (fen2)
-7F93 (ba1)
-7F94 (gao1)
-7F95 (yang4)
-7F96 (gu3)
-7F97 (qiang1)
-7F98 (zang1)
-7F99 (gao1)
-7F9A (ling2)
-7F9B (yi4)
-7F9C (zhu4)
-7F9D (di1)
-7F9E (xiu1)
-7F9F (qiang3)
-7FA0 (yi2)
-7FA1 (xian4)
-7FA2 (rong2)
-7FA3 (qun2)
-7FA4 (qun2)
-7FA5 (qian1,qiang3)
-7FA6 (huan2)
-7FA7 (suo1)
-7FA8 (xian4)
-7FA9 (yi4)
-7FAA (yang3)
-7FAB (qiang1)
-7FAC (xian2)
-7FAD (yu2)
-7FAE (geng1)
-7FAF (jie2)
-7FB0 (tang1)
-7FB1 (yuan2)
-7FB2 (xi1)
-7FB3 (fan2)
-7FB4 (shan1)
-7FB5 (fen4)
-7FB6 (shan1)
-7FB7 (lian3)
-7FB8 (lei2)
-7FB9 (geng1)
-7FBA (nou2)
-7FBB (qiang4)
-7FBC (chan4)
-7FBD (yu3)
-7FBE (gong4)
-7FBF (yi4)
-7FC0 (chong2,chong1)
-7FC1 (weng1)
-7FC2 (fen1)
-7FC3 (hong2)
-7FC4 (chi4)
-7FC5 (chi4)
-7FC6 (cui2)
-7FC7 (fu2,pei4)
-7FC8 (xia2)
-7FC9 (pen3)
-7FCA (yi4)
-7FCB (la1)
-7FCC (yi4)
-7FCD (pi1,po1)
-7FCE (ling2)
-7FCF (liu4)
-7FD0 (zhi4)
-7FD1 (qu2)
-7FD2 (xi2)
-7FD3 (xie2)
-7FD4 (xiang2)
-7FD5 (xi1,xi4)
-7FD6 (xi4)
-7FD7 (qi2)
-7FD8 (qiao2,qiao4)
-7FD9 (hui4)
-7FDA (hui1)
-7FDB (shu4)
-7FDC (se4)
-7FDD (hong2)
-7FDE (jiang1)
-7FDF (zhai2,di2)
-7FE0 (cui4)
-7FE1 (fei3)
-7FE2 (tao1)
-7FE3 (sha4)
-7FE4 (chi4)
-7FE5 (zhu4)
-7FE6 (jian3)
-7FE7 (xuan1)
-7FE8 (shi4)
-7FE9 (pian1)
-7FEA (zong1)
-7FEB (wan4)
-7FEC (hui1)
-7FED (hou2)
-7FEE (he2)
-7FEF (he4)
-7FF0 (han4)
-7FF1 (ao2)
-7FF2 (piao1)
-7FF3 (yi4)
-7FF4 (lian2)
-7FF5 (qu2)
-7FF6 (none0)
-7FF7 (lin2)
-7FF8 (pen3)
-7FF9 (qiao2,qiao4)
-7FFA (ao2)
-7FFB (fan1)
-7FFC (yi4)
-7FFD (hui4)
-7FFE (xuan1)
-7FFF (dao4)
-8000 (yao4,yue4)
-8001 (lao3)
-8002 (none0)
-8003 (kao3)
-8004 (mao4)
-8005 (zhe3)
-8006 (qi2)
-8007 (gou3)
-8008 (gou2)
-8009 (gou3)
-800A (die2)
-800B (die2)
-800C (er2)
-800D (shua3)
-800E (ruan3)
-800F (er2)
-8010 (nai4)
-8011 (zhuan1,duan1)
-8012 (lei3)
-8013 (ting1)
-8014 (zi3)
-8015 (geng1)
-8016 (chao4)
-8017 (hao4)
-8018 (yun2)
-8019 (pa2,ba4)
-801A (pi1)
-801B (chi2)
-801C (si4)
-801D (qu4)
-801E (jia1)
-801F (ju4)
-8020 (huo1)
-8021 (chu2)
-8022 (lao4)
-8023 (lun3)
-8024 (ji2)
-8025 (tang1,tang3)
-8026 (ou3)
-8027 (lou2)
-8028 (nou4)
-8029 (jiang3)
-802A (pang3)
-802B (ze2)
-802C (lou2)
-802D (ji1)
-802E (lao4)
-802F (huo4)
-8030 (you1)
-8031 (mo4)
-8032 (huai2)
-8033 (er3)
-8034 (zhe2)
-8035 (ding1)
-8036 (ye1,ye2)
-8037 (da1)
-8038 (song3)
-8039 (qin2)
-803A (yun2)
-803B (chi3)
-803C (dan1)
-803D (dan1)
-803E (hong2)
-803F (geng3)
-8040 (zhi2)
-8041 (none0)
-8042 (nie4)
-8043 (dan1)
-8044 (zhen3)
-8045 (che4)
-8046 (ling2)
-8047 (zheng1)
-8048 (you3)
-8049 (wa1)
-804A (liao2)
-804B (long2)
-804C (zhi2)
-804D (ning2)
-804E (tiao1)
-804F (er2,er4)
-8050 (ya4)
-8051 (die2)
-8052 (guo1,gua1)
-8053 (none0)
-8054 (lian2)
-8055 (hao4)
-8056 (sheng4)
-8057 (lie4)
-8058 (pin4)
-8059 (jing1)
-805A (ju4)
-805B (bi4)
-805C (di3)
-805D (guo2)
-805E (wen2,wen4)
-805F (xu4)
-8060 (ping1)
-8061 (cong1)
-8062 (none0)
-8063 (none0)
-8064 (ting2)
-8065 (yu3)
-8066 (cong1)
-8067 (kui2)
-8068 (lian2)
-8069 (kui4)
-806A (cong1)
-806B (lian2)
-806C (weng3)
-806D (kui4)
-806E (lian2)
-806F (lian2)
-8070 (cong1)
-8071 (ao2)
-8072 (sheng1)
-8073 (song3)
-8074 (ting1)
-8075 (kui4)
-8076 (nie4)
-8077 (zhi2)
-8078 (dan1)
-8079 (ning2)
-807A (none0)
-807B (ji1)
-807C (ting1)
-807D (ting1,ting4)
-807E (long2)
-807F (yu4)
-8080 (yu4)
-8081 (zhao4)
-8082 (si4)
-8083 (su4)
-8084 (yi4)
-8085 (su4)
-8086 (si4)
-8087 (zhao4)
-8088 (zhao4)
-8089 (rou4)
-808A (yi4)
-808B (lei4,le4,le1)
-808C (ji1)
-808D (qiu2)
-808E (ken3)
-808F (cao4)
-8090 (ge1)
-8091 (di4)
-8092 (huan2)
-8093 (huang1)
-8094 (yi3)
-8095 (ren4)
-8096 (xiao4,xiao1)
-8097 (ru3)
-8098 (zhou3)
-8099 (yuan1)
-809A (du4,du3)
-809B (gang1)
-809C (rong2)
-809D (gan1)
-809E (cha1)
-809F (wo4)
-80A0 (chang2)
-80A1 (gu3)
-80A2 (zhi1)
-80A3 (qin2)
-80A4 (fu1)
-80A5 (fei2)
-80A6 (ban1)
-80A7 (pei1)
-80A8 (pang4)
-80A9 (jian1)
-80AA (fang2)
-80AB (zhun1)
-80AC (you2)
-80AD (na4)
-80AE (ang1)
-80AF (ken3)
-80B0 (ran2)
-80B1 (gong1)
-80B2 (yu4,yo1)
-80B3 (wen3)
-80B4 (yao2)
-80B5 (jin4)
-80B6 (pi2)
-80B7 (qian3)
-80B8 (xi4)
-80B9 (xi4)
-80BA (fei4)
-80BB (ken3)
-80BC (jing3)
-80BD (tai4)
-80BE (shen4)
-80BF (zhong3)
-80C0 (zhang4)
-80C1 (xie2)
-80C2 (shen4)
-80C3 (wei4)
-80C4 (zhou4)
-80C5 (die2)
-80C6 (dan3)
-80C7 (fei4)
-80C8 (ba2)
-80C9 (bo2)
-80CA (qu2)
-80CB (tian2)
-80CC (bei4,bei1)
-80CD (gua1)
-80CE (tai1)
-80CF (zi3)
-80D0 (ku1)
-80D1 (zhi1)
-80D2 (ni4)
-80D3 (ping2)
-80D4 (zi4)
-80D5 (fu4)
-80D6 (pang4,pan2)
-80D7 (zhen1)
-80D8 (xian2)
-80D9 (zuo4)
-80DA (pei1)
-80DB (jia3)
-80DC (sheng4,sheng1)
-80DD (zhi1)
-80DE (bao1)
-80DF (mu3)
-80E0 (qu1)
-80E1 (hu2)
-80E2 (ke1)
-80E3 (yi3)
-80E4 (yin4)
-80E5 (xu1)
-80E6 (yang1)
-80E7 (long2)
-80E8 (dong4)
-80E9 (ka3)
-80EA (lu2)
-80EB (jing4)
-80EC (nu3)
-80ED (yan1)
-80EE (pang1)
-80EF (kua4)
-80F0 (yi2)
-80F1 (guang1)
-80F2 (hai3,gai3)
-80F3 (ge1,ga1,ge2)
-80F4 (dong4)
-80F5 (zhi4)
-80F6 (jiao1)
-80F7 (xiong1)
-80F8 (xiong1)
-80F9 (er2)
-80FA (an4)
-80FB (xing2)
-80FC (pian2)
-80FD (neng2)
-80FE (zi4)
-80FF (none0)
-8100 (cheng2)
-8101 (tiao4)
-8102 (zhi1)
-8103 (cui4)
-8104 (mei2)
-8105 (xie2)
-8106 (cui4)
-8107 (xie2)
-8108 (mo4,mai4)
-8109 (mai4,mo4)
-810A (ji3,ji2)
-810B (xie2)
-810C (none0)
-810D (kuai4)
-810E (sa4)
-810F (zang4,zang1)
-8110 (qi2)
-8111 (nao3)
-8112 (mi3)
-8113 (nong2)
-8114 (luan2)
-8115 (wan3)
-8116 (bo2)
-8117 (wen3)
-8118 (wan3)
-8119 (qiu2)
-811A (jiao3,jue2,jia3)
-811B (jing4)
-811C (you3)
-811D (heng1)
-811E (cuo3)
-811F (lie4)
-8120 (shan1)
-8121 (ting3)
-8122 (mei2)
-8123 (chun2)
-8124 (shen4)
-8125 (xie2)
-8126 (none0)
-8127 (juan1)
-8128 (cu4)
-8129 (xiu1)
-812A (xin4)
-812B (tuo1)
-812C (pao1)
-812D (cheng2)
-812E (nei3)
-812F (fu3,pu2)
-8130 (dou4)
-8131 (tuo1)
-8132 (niao4)
-8133 (nao3)
-8134 (pi3)
-8135 (gu3)
-8136 (luo2)
-8137 (li4)
-8138 (lian3)
-8139 (zhang4)
-813A (cui4)
-813B (jie2)
-813C (liang3)
-813D (shui2)
-813E (pi2)
-813F (biao1)
-8140 (lun2)
-8141 (pian2)
-8142 (guo4)
-8143 (juan4)
-8144 (chui2,zhui1)
-8145 (dan4)
-8146 (tian3)
-8147 (nei3)
-8148 (jing1)
-8149 (jie1)
-814A (la4,xi1)
-814B (ye4,yi4)
-814C (a1,yan1)
-814D (ren3)
-814E (shen4)
-814F (chuo4,duo2)
-8150 (fu3)
-8151 (fu3)
-8152 (ju1)
-8153 (fei2)
-8154 (qiang1)
-8155 (wan4)
-8156 (dong4)
-8157 (pi2)
-8158 (guo2)
-8159 (zong1)
-815A (ding4)
-815B (wu1)
-815C (mei2)
-815D (ruan3)
-815E (zhuan4,dun4)
-815F (zhi4)
-8160 (cou4)
-8161 (gua1,luo2)
-8162 (ou3)
-8163 (di4)
-8164 (an1)
-8165 (xing1)
-8166 (nao3)
-8167 (shu4)
-8168 (shuan4)
-8169 (nan3)
-816A (yun4)
-816B (zhong3)
-816C (rou2)
-816D (e4)
-816E (sai1)
-816F (tu2)
-8170 (yao1)
-8171 (jian4)
-8172 (wei3)
-8173 (jiao3)
-8174 (yu2)
-8175 (jia1)
-8176 (duan4)
-8177 (bi4)
-8178 (chang2)
-8179 (fu4)
-817A (xian4)
-817B (ni4)
-817C (mian3)
-817D (wa4)
-817E (teng2)
-817F (tui3)
-8180 (bang3,pang1,pang2,bang4)
-8181 (qian3)
-8182 (lu:3)
-8183 (wa4)
-8184 (shou4)
-8185 (tang2)
-8186 (su4)
-8187 (zhui4)
-8188 (ge2)
-8189 (yi4)
-818A (bo2,bo5)
-818B (liao2)
-818C (ji2)
-818D (pi2)
-818E (xie2)
-818F (gao1,gao4)
-8190 (lu:3)
-8191 (bin4)
-8192 (none0)
-8193 (chang2)
-8194 (lu4)
-8195 (guo2)
-8196 (pang1)
-8197 (chuai2)
-8198 (biao1)
-8199 (jiang3)
-819A (fu1)
-819B (tang2)
-819C (mo2,mo4)
-819D (xi1)
-819E (zhuan1)
-819F (lu:4)
-81A0 (jiao1)
-81A1 (ying4)
-81A2 (lu:2)
-81A3 (zhi4)
-81A4 (xue3)
-81A5 (chun1)
-81A6 (lin4)
-81A7 (tong2)
-81A8 (peng2)
-81A9 (ni4)
-81AA (chuai4)
-81AB (liao2)
-81AC (cui4)
-81AD (gui1)
-81AE (xiao1)
-81AF (teng1)
-81B0 (fan2)
-81B1 (zhi2)
-81B2 (jiao1)
-81B3 (shan4)
-81B4 (hu1)
-81B5 (cui4)
-81B6 (run4)
-81B7 (xin4)
-81B8 (sui3)
-81B9 (fen4)
-81BA (ying1)
-81BB (shan1)
-81BC (gua1)
-81BD (dan3)
-81BE (kuai4)
-81BF (nong2)
-81C0 (tun2)
-81C1 (lian2)
-81C2 (bei5,bi4,bei4)
-81C3 (yong1)
-81C4 (jue2)
-81C5 (chu4)
-81C6 (yi4)
-81C7 (juan3)
-81C8 (la4,xi1)
-81C9 (lian3)
-81CA (sao1,sao4)
-81CB (tun2)
-81CC (gu3)
-81CD (qi2)
-81CE (cui4)
-81CF (bin4)
-81D0 (xun1)
-81D1 (nao4,ru2)
-81D2 (huo4)
-81D3 (zang4)
-81D4 (xian4)
-81D5 (biao1)
-81D6 (xing4)
-81D7 (kuan1)
-81D8 (la4,xi1)
-81D9 (yan1)
-81DA (lu2)
-81DB (hu4)
-81DC (za1)
-81DD (luo3)
-81DE (qu2)
-81DF (zang4)
-81E0 (luan2)
-81E1 (ni2)
-81E2 (za1)
-81E3 (chen2)
-81E4 (qian1)
-81E5 (wo4)
-81E6 (guang4,wang3)
-81E7 (zang1)
-81E8 (lin2)
-81E9 (guang4)
-81EA (zi4)
-81EB (jiao3)
-81EC (nie4)
-81ED (chou4,xiu4)
-81EE (ji4)
-81EF (gao1)
-81F0 (chou4,xiu4)
-81F1 (mian2)
-81F2 (nie4)
-81F3 (zhi4)
-81F4 (zhi4)
-81F5 (ge2)
-81F6 (jian4)
-81F7 (die2)
-81F8 (zhi4)
-81F9 (xiu1)
-81FA (tai2,tai1)
-81FB (zhen1)
-81FC (jiu4)
-81FD (xian4)
-81FE (yu2)
-81FF (cha2)
-8200 (yao3)
-8201 (yu2)
-8202 (chong1)
-8203 (xi4)
-8204 (xi4)
-8205 (jiu4)
-8206 (yu2)
-8207 (yu3,yu4)
-8208 (xing1,xing4)
-8209 (ju3)
-820A (jiu4)
-820B (xin4)
-820C (she2)
-820D (she4,she3)
-820E (she3,she4)
-820F (jiu3)
-8210 (shi4)
-8211 (tan1)
-8212 (shu1)
-8213 (shi4)
-8214 (tian3)
-8215 (dan4)
-8216 (pu4)
-8217 (pu4,pu1)
-8218 (guan3)
-8219 (hua4)
-821A (tian4)
-821B (chuan3)
-821C (shun4)
-821D (xia2)
-821E (wu3)
-821F (zhou1)
-8220 (dao1)
-8221 (chuan2)
-8222 (shan1)
-8223 (yi3)
-8224 (none0)
-8225 (pa1)
-8226 (tai4)
-8227 (fan2)
-8228 (ban3)
-8229 (chuan2)
-822A (hang2)
-822B (fang3)
-822C (ban1,bo1,pan2)
-822D (bi3)
-822E (lu2)
-822F (zhong1)
-8230 (jian4)
-8231 (cang1)
-8232 (ling2)
-8233 (zhu2)
-8234 (ze2)
-8235 (duo4,tuo2)
-8236 (bo2)
-8237 (xian2)
-8238 (ge3)
-8239 (chuan2)
-823A (jia2,xia2)
-823B (lu2)
-823C (hong2)
-823D (pang2)
-823E (xi1)
-823F (none0)
-8240 (fu2)
-8241 (zao4)
-8242 (feng2)
-8243 (li2)
-8244 (shao1)
-8245 (yu2)
-8246 (lang2)
-8247 (ting3)
-8248 (none0)
-8249 (wei3)
-824A (bo2)
-824B (meng3)
-824C (nian4)
-824D (ju1)
-824E (huang2)
-824F (shou3)
-8250 (zong1)
-8251 (bian4)
-8252 (mao4)
-8253 (die2)
-8254 (none0)
-8255 (bang4)
-8256 (cha1)
-8257 (yi4)
-8258 (sou1,sao1)
-8259 (cang1)
-825A (cao2)
-825B (lou2)
-825C (dai4)
-825D (none0)
-825E (yao4)
-825F (chong1,tong2)
-8260 (none0)
-8261 (dang1)
-8262 (qiang2)
-8263 (lu3)
-8264 (yi3)
-8265 (jie4)
-8266 (jian4)
-8267 (huo4)
-8268 (meng2)
-8269 (qi2)
-826A (lu3)
-826B (lu2)
-826C (chan2)
-826D (shuang1)
-826E (gen4,gen3)
-826F (liang2)
-8270 (jian1)
-8271 (jian1)
-8272 (se4,shai3)
-8273 (yan4)
-8274 (fu2)
-8275 (ping2)
-8276 (yan4)
-8277 (yan4)
-8278 (cao3)
-8279 (cao3)
-827A (yi4)
-827B (le4)
-827C (ting1)
-827D (jiao1)
-827E (ai4,yi4)
-827F (nai3)
-8280 (tiao2)
-8281 (jiao1)
-8282 (jie2,jie1)
-8283 (peng2)
-8284 (wan2)
-8285 (yi4)
-8286 (chai1)
-8287 (mian2)
-8288 (mi3)
-8289 (gan4)
-828A (qian1)
-828B (yu4)
-828C (yu4)
-828D (shao2)
-828E (xiong1)
-828F (du4)
-8290 (xia4)
-8291 (qi3)
-8292 (mang2,wang2)
-8293 (zi3)
-8294 (hui4)
-8295 (sui1)
-8296 (zhi4)
-8297 (xiang1)
-8298 (bi4,pi2)
-8299 (fu2)
-829A (tun2)
-829B (wei3)
-829C (wu2)
-829D (zhi1)
-829E (qi3)
-829F (shan1)
-82A0 (wen2)
-82A1 (qian4)
-82A2 (ren2)
-82A3 (fou2)
-82A4 (kou1)
-82A5 (jie4,gai4)
-82A6 (lu2,lu3)
-82A7 (zhu4)
-82A8 (ji1)
-82A9 (qin2)
-82AA (qi2)
-82AB (yan2,yuan2)
-82AC (fen1)
-82AD (ba1)
-82AE (rui4)
-82AF (xin1,xin4)
-82B0 (ji4)
-82B1 (hua1)
-82B2 (hua1)
-82B3 (fang1)
-82B4 (wu4)
-82B5 (jue2)
-82B6 (gou1)
-82B7 (zhi3)
-82B8 (yun2)
-82B9 (qin2)
-82BA (ao3)
-82BB (chu2)
-82BC (mao4)
-82BD (ya2,di2)
-82BE (fei4,fu2)
-82BF (reng4)
-82C0 (hang2)
-82C1 (cong1)
-82C2 (yin2)
-82C3 (you3)
-82C4 (bian4)
-82C5 (yi4)
-82C6 (none0)
-82C7 (wei3)
-82C8 (li4)
-82C9 (pi3)
-82CA (e4)
-82CB (xian4)
-82CC (chang2)
-82CD (cang1)
-82CE (zhu4,ning2)
-82CF (su1)
-82D0 (yi2,ti2)
-82D1 (yuan4)
-82D2 (ran3)
-82D3 (ling2)
-82D4 (tai2,tai1)
-82D5 (tiao2,shao2)
-82D6 (di2)
-82D7 (miao2)
-82D8 (qing3)
-82D9 (li4)
-82DA (rao2)
-82DB (ke1)
-82DC (mu4)
-82DD (pei4)
-82DE (bao1)
-82DF (gou3)
-82E0 (min2)
-82E1 (yi3)
-82E2 (yi3)
-82E3 (ju4,qu3)
-82E4 (pie3)
-82E5 (ruo4,re3)
-82E6 (ku3)
-82E7 (zhu4,ning2)
-82E8 (ni3)
-82E9 (bo2)
-82EA (bing3)
-82EB (shan1,shan4)
-82EC (qiu2)
-82ED (yao3)
-82EE (xian1)
-82EF (ben3)
-82F0 (hong2)
-82F1 (ying1)
-82F2 (zha3)
-82F3 (dong1)
-82F4 (ju1)
-82F5 (die2)
-82F6 (nie2)
-82F7 (gan1)
-82F8 (hu1)
-82F9 (ping2,pin2)
-82FA (mei2)
-82FB (fu2)
-82FC (sheng1)
-82FD (gu1)
-82FE (bi4)
-82FF (wei4)
-8300 (fu2)
-8301 (zhuo2)
-8302 (mao4)
-8303 (fan4)
-8304 (qie2,jia1)
-8305 (mao2)
-8306 (mao2,mao3)
-8307 (ba2)
-8308 (zi3,ci2)
-8309 (mo4)
-830A (zi1)
-830B (di3)
-830C (chi2)
-830D (gou3)
-830E (jing1)
-830F (long2)
-8310 (none0)
-8311 (niao3)
-8312 (none0)
-8313 (xue2)
-8314 (ying2)
-8315 (qiong2)
-8316 (ge2)
-8317 (ming2)
-8318 (li4)
-8319 (rong2)
-831A (yin4)
-831B (gen4)
-831C (qian4,xi1)
-831D (chai3)
-831E (chen2)
-831F (yu4)
-8320 (xiu1)
-8321 (zi4)
-8322 (lie4)
-8323 (wu2)
-8324 (duo1)
-8325 (kui1)
-8326 (ce4)
-8327 (jian3)
-8328 (ci2)
-8329 (gou3)
-832A (guang1)
-832B (mang2)
-832C (cha2,zha1)
-832D (jiao1)
-832E (jiao1)
-832F (fu2)
-8330 (yu2)
-8331 (zhu1)
-8332 (zi1)
-8333 (jiang1)
-8334 (hui2)
-8335 (yin1)
-8336 (cha2)
-8337 (fa2)
-8338 (rong2,rong3)
-8339 (ru2,ru4)
-833A (chong1)
-833B (mang3)
-833C (tong2)
-833D (zhong4)
-833E (none0)
-833F (zhu2)
-8340 (xun2)
-8341 (huan2)
-8342 (kua1)
-8343 (quan2)
-8344 (gai1)
-8345 (da2)
-8346 (jing1)
-8347 (xing4)
-8348 (chuan3)
-8349 (cao3)
-834A (jing1)
-834B (er2)
-834C (an4)
-834D (shou1)
-834E (chi2)
-834F (ren3)
-8350 (jian4)
-8351 (ti2,yi2)
-8352 (huang1,huang5)
-8353 (ping2)
-8354 (li4)
-8355 (jin1)
-8356 (lao3,pei2)
-8357 (rong2)
-8358 (zhuang1)
-8359 (da2)
-835A (jia2)
-835B (rao2)
-835C (bi4)
-835D (ce4)
-835E (qiao2)
-835F (hui4)
-8360 (ji4,qi2)
-8361 (dang4)
-8362 (none0)
-8363 (rong2)
-8364 (hun1,xun1)
-8365 (ying2,xing2)
-8366 (luo4)
-8367 (ying2)
-8368 (qian2,xun2)
-8369 (jin4)
-836A (sun1)
-836B (yin4,yin1)
-836C (mai3)
-836D (hong2)
-836E (zhou4)
-836F (yao4)
-8370 (du4)
-8371 (wei3)
-8372 (chu4)
-8373 (dou4)
-8374 (fu1)
-8375 (ren3)
-8376 (yin2)
-8377 (he2,he4)
-8378 (bi2)
-8379 (bu4)
-837A (yun2)
-837B (di2)
-837C (tu2)
-837D (sui1)
-837E (sui1)
-837F (cheng2)
-8380 (chen2)
-8381 (wu2)
-8382 (bie2)
-8383 (xi1)
-8384 (geng3)
-8385 (li4)
-8386 (pu2)
-8387 (zhu4)
-8388 (mo4)
-8389 (li4)
-838A (zhuang1)
-838B (ji2)
-838C (duo2)
-838D (qiu2)
-838E (sha1,suo1)
-838F (suo1)
-8390 (chen2)
-8391 (feng1)
-8392 (ju3)
-8393 (mei2)
-8394 (meng2)
-8395 (xing4)
-8396 (jing1)
-8397 (che1)
-8398 (xin1,shen1)
-8399 (jun1)
-839A (yan2,yan4)
-839B (ting2)
-839C (you2)
-839D (cuo4)
-839E (guan1,guan3,wan3,wan1)
-839F (han4)
-83A0 (you3)
-83A1 (cuo4)
-83A2 (jia2)
-83A3 (wang4)
-83A4 (you2)
-83A5 (niu3,chou3)
-83A6 (shao1)
-83A7 (xian4)
-83A8 (lang4,liang2,lang2)
-83A9 (fu2,piao3)
-83AA (e2)
-83AB (mo4)
-83AC (wen4)
-83AD (jie2)
-83AE (nan2)
-83AF (mu4)
-83B0 (kan3)
-83B1 (lai2)
-83B2 (lian2)
-83B3 (shi4,shi2)
-83B4 (wo1,zhua1)
-83B5 (tu2,tu4)
-83B6 (xian1)
-83B7 (huo4)
-83B8 (you2)
-83B9 (ying2)
-83BA (ying1)
-83BB (none0)
-83BC (chun2)
-83BD (mang3)
-83BE (mang3)
-83BF (ci4)
-83C0 (yu4,wan3)
-83C1 (jing1)
-83C2 (di4)
-83C3 (qu2)
-83C4 (dong1)
-83C5 (jian1)
-83C6 (zou1)
-83C7 (gu1)
-83C8 (la1)
-83C9 (lu4,lu:4)
-83CA (ju2)
-83CB (wei4)
-83CC (jun1,jun4)
-83CD (nie4)
-83CE (kun1)
-83CF (he2)
-83D0 (pu2)
-83D1 (zai1)
-83D2 (gao3)
-83D3 (guo3)
-83D4 (fu2)
-83D5 (lun2)
-83D6 (chang1)
-83D7 (chou2)
-83D8 (song1)
-83D9 (chui2)
-83DA (zhan4)
-83DB (men2)
-83DC (cai4)
-83DD (ba2)
-83DE (li2)
-83DF (tu4,tu2)
-83E0 (bo1)
-83E1 (han4)
-83E2 (bao4)
-83E3 (qin4)
-83E4 (juan3)
-83E5 (xi1)
-83E6 (qin2)
-83E7 (di3)
-83E8 (jie1)
-83E9 (pu2)
-83EA (dang4)
-83EB (jin3)
-83EC (zhao3)
-83ED (tai2)
-83EE (geng1)
-83EF (hua2,hua4,hua1)
-83F0 (gu1)
-83F1 (ling2)
-83F2 (fei1,fei3)
-83F3 (jin1)
-83F4 (an4)
-83F5 (wang3)
-83F6 (beng3)
-83F7 (zhou3)
-83F8 (yan1)
-83F9 (zu1)
-83FA (jian1)
-83FB (lin3)
-83FC (tan3)
-83FD (shu1,shu2)
-83FE (tian2)
-83FF (dao4)
-8400 (hu3)
-8401 (ji1,qi2)
-8402 (he2)
-8403 (cui4)
-8404 (tao2)
-8405 (chun1)
-8406 (bei1,bi4)
-8407 (chang2)
-8408 (huan2)
-8409 (fei2)
-840A (lai2)
-840B (qi1)
-840C (meng2)
-840D (ping2)
-840E (wei3,wei1)
-840F (dan4)
-8410 (sha4)
-8411 (huan2)
-8412 (yan3)
-8413 (yi2)
-8414 (tiao2)
-8415 (qi2,ji4)
-8416 (wan3)
-8417 (ce4)
-8418 (nai4)
-8419 (none0)
-841A (tuo4)
-841B (jiu1)
-841C (tie1)
-841D (luo2)
-841E (none0)
-841F (none0)
-8420 (meng2)
-8421 (none0)
-8422 (none0)
-8423 (ding4)
-8424 (ying2)
-8425 (ying2)
-8426 (ying2)
-8427 (xiao1)
-8428 (sa4)
-8429 (qiu1)
-842A (ke1)
-842B (xiang4)
-842C (wan4,mo4)
-842D (yu3)
-842E (yu4)
-842F (fu4)
-8430 (lian4)
-8431 (xuan1)
-8432 (xuan1)
-8433 (nan2)
-8434 (ze2)
-8435 (wo1)
-8436 (chun3)
-8437 (xiao1)
-8438 (yu2)
-8439 (pian1,bian3)
-843A (mao4)
-843B (an1)
-843C (e4)
-843D (luo4,la4,lao4,luo1)
-843E (ying2)
-843F (huo2)
-8440 (gua1)
-8441 (jiang1)
-8442 (wan3)
-8443 (zuo2)
-8444 (zuo4)
-8445 (ju1)
-8446 (bao3)
-8447 (rou2)
-8448 (xi3)
-8449 (xie2,ye4,she4)
-844A (an1)
-844B (qu2)
-844C (jian1)
-844D (fu2)
-844E (lu:4)
-844F (lu:4)
-8450 (pen2)
-8451 (feng1,feng4)
-8452 (hong2)
-8453 (hong2)
-8454 (hou2)
-8455 (yan2)
-8456 (tu1)
-8457 (zhu4,zhe5,zhao1,zhao2,zhu3,zi1,zhuo2)
-8458 (zi1)
-8459 (xiang1)
-845A (shen4,ren4)
-845B (ge3,ge2)
-845C (qia1)
-845D (jing4)
-845E (mi3)
-845F (huang2)
-8460 (shen1)
-8461 (pu2)
-8462 (ge3)
-8463 (dong3)
-8464 (zhou4)
-8465 (qian2)
-8466 (wei3)
-8467 (bo2)
-8468 (wei1)
-8469 (pa1)
-846A (ji4)
-846B (hu2)
-846C (zang4)
-846D (jia1)
-846E (duan4)
-846F (yao4)
-8470 (jun4)
-8471 (cong1)
-8472 (quan2)
-8473 (wei1)
-8474 (xian2)
-8475 (kui2)
-8476 (ting2)
-8477 (hun1,xun1)
-8478 (xi3)
-8479 (shi1)
-847A (qi4)
-847B (lan2)
-847C (zong1)
-847D (yao1)
-847E (yuan1)
-847F (mei2)
-8480 (yun1)
-8481 (shu4)
-8482 (di4)
-8483 (zhuan4)
-8484 (guan1)
-8485 (none0)
-8486 (qiong2)
-8487 (chan3)
-8488 (kai3)
-8489 (kui4)
-848A (none0)
-848B (jiang3)
-848C (lou2)
-848D (wei3)
-848E (pai4)
-848F (none0)
-8490 (sou1)
-8491 (yin1)
-8492 (shi1)
-8493 (chun2)
-8494 (shi4,shi2)
-8495 (yun1)
-8496 (zhen1)
-8497 (lang4)
-8498 (nu2)
-8499 (meng3,meng2,meng1)
-849A (he2)
-849B (que1)
-849C (suan4)
-849D (yuan2)
-849E (li4)
-849F (ju3)
-84A0 (xi2)
-84A1 (bang4,pang2)
-84A2 (chu2)
-84A3 (xu2)
-84A4 (tu2)
-84A5 (liu2)
-84A6 (huo4)
-84A7 (zhen1)
-84A8 (qian4)
-84A9 (zu1)
-84AA (po4)
-84AB (cuo1)
-84AC (yuan1)
-84AD (chu2)
-84AE (yu4)
-84AF (kuai3)
-84B0 (pan2)
-84B1 (pu2)
-84B2 (pu2)
-84B3 (na4)
-84B4 (shuo4)
-84B5 (xi1)
-84B6 (fen2)
-84B7 (yun2)
-84B8 (zheng1)
-84B9 (jian1)
-84BA (ji2)
-84BB (ruo4)
-84BC (cang1)
-84BD (en1)
-84BE (mi2)
-84BF (hao1)
-84C0 (sun1)
-84C1 (zhen1)
-84C2 (ming2)
-84C3 (none0)
-84C4 (xu4)
-84C5 (liu2)
-84C6 (xi2)
-84C7 (gu1)
-84C8 (lang2)
-84C9 (rong2)
-84CA (weng3)
-84CB (gai4,ge3,he2)
-84CC (cuo4)
-84CD (shi1)
-84CE (tang2)
-84CF (luo3)
-84D0 (ru4)
-84D1 (suo1)
-84D2 (xian1)
-84D3 (bei4)
-84D4 (yao3)
-84D5 (gui4)
-84D6 (bi4)
-84D7 (zong3)
-84D8 (gun3)
-84D9 (none0)
-84DA (xiu1)
-84DB (ce4)
-84DC (none0)
-84DD (lan2,lan5,la5)
-84DE (none0)
-84DF (ji4)
-84E0 (li2)
-84E1 (can1)
-84E2 (lang2)
-84E3 (yu4)
-84E4 (none0)
-84E5 (ying2)
-84E6 (mo4)
-84E7 (diao4)
-84E8 (xiu1)
-84E9 (wu4)
-84EA (tong1)
-84EB (zhu2)
-84EC (peng2)
-84ED (an1)
-84EE (lian2)
-84EF (cong1)
-84F0 (xi3)
-84F1 (ping2)
-84F2 (qiu1,ou1)
-84F3 (jin4)
-84F4 (chun2)
-84F5 (jie2)
-84F6 (wei3)
-84F7 (tui1)
-84F8 (cao2)
-84F9 (yu4)
-84FA (yi4)
-84FB (ji2)
-84FC (liao3,lu4)
-84FD (bi4)
-84FE (lu3)
-84FF (xu5,su4)
-8500 (bu4)
-8501 (zhang1)
-8502 (luo2)
-8503 (qiang2)
-8504 (man4)
-8505 (yan2)
-8506 (leng2)
-8507 (ji4)
-8508 (biao1,piao4)
-8509 (gun3)
-850A (han3)
-850B (di2)
-850C (su4)
-850D (lu4)
-850E (she4)
-850F (shang1)
-8510 (di2)
-8511 (mie4)
-8512 (xun1)
-8513 (man4,wan4,man2)
-8514 (bo5,bu3,bo2)
-8515 (di4)
-8516 (cuo2)
-8517 (zhe4)
-8518 (sen1)
-8519 (xuan4)
-851A (yu4,wei4)
-851B (hu2)
-851C (ao2)
-851D (mi3)
-851E (lou2)
-851F (cu4)
-8520 (zhong1)
-8521 (cai4)
-8522 (po2)
-8523 (jiang3)
-8524 (mi4)
-8525 (cong1)
-8526 (niao3)
-8527 (hui4)
-8528 (jun4)
-8529 (yin2)
-852A (jian4)
-852B (nian1)
-852C (shu1)
-852D (yin4,yin1)
-852E (kui4)
-852F (chen2)
-8530 (hu4)
-8531 (sha1)
-8532 (kou4)
-8533 (qian4)
-8534 (ma2,ma1)
-8535 (cang2,zang4)
-8536 (ze2)
-8537 (qiang2)
-8538 (dou1)
-8539 (lian3)
-853A (lin4)
-853B (kou4)
-853C (ai3)
-853D (bi4)
-853E (li2)
-853F (wei3)
-8540 (ji2)
-8541 (qian2,xun2)
-8542 (sheng4)
-8543 (fan2,fan1,bo1)
-8544 (meng2)
-8545 (ou3)
-8546 (chan3)
-8547 (dian3)
-8548 (xun4,jun4)
-8549 (jiao1,qiao2)
-854A (rui3)
-854B (rui3)
-854C (lei3)
-854D (yu2)
-854E (qiao2)
-854F (chu2)
-8550 (hua2,hua1,hua4)
-8551 (jian1)
-8552 (mai3)
-8553 (yun2)
-8554 (bao1)
-8555 (you2)
-8556 (qu2)
-8557 (lu4)
-8558 (rao2)
-8559 (hui4)
-855A (e4)
-855B (ti2)
-855C (fei3)
-855D (jue2)
-855E (zui4)
-855F (fa4)
-8560 (ru2)
-8561 (fen2)
-8562 (kui4)
-8563 (shun4)
-8564 (rui2)
-8565 (ya3)
-8566 (xu1)
-8567 (fu4)
-8568 (jue2)
-8569 (dang4)
-856A (wu2)
-856B (tong2)
-856C (si1)
-856D (xiao1)
-856E (xi4)
-856F (yong1)
-8570 (wen1)
-8571 (shao1)
-8572 (qi2)
-8573 (jian1)
-8574 (yun4)
-8575 (sun1)
-8576 (ling2)
-8577 (yu4)
-8578 (xia2)
-8579 (weng4)
-857A (ji2)
-857B (hong2,hong4)
-857C (si4)
-857D (deng1)
-857E (lei3)
-857F (xuan1)
-8580 (yun4)
-8581 (yu4)
-8582 (xi2)
-8583 (hao4)
-8584 (bo2,bao2,bo4)
-8585 (hao1)
-8586 (ai4)
-8587 (wei1,wei2)
-8588 (hui4)
-8589 (wei4)
-858A (ji4)
-858B (ci2)
-858C (xiang1)
-858D (luan4)
-858E (mie4)
-858F (yi4)
-8590 (leng2)
-8591 (jiang1)
-8592 (can4)
-8593 (shen1,can1,cen1)
-8594 (qiang2)
-8595 (lian2)
-8596 (ke1)
-8597 (yuan2)
-8598 (da2)
-8599 (ti4)
-859A (tang2)
-859B (xue1)
-859C (bi4,bo4)
-859D (zhan1)
-859E (sun1)
-859F (lian4,xian1)
-85A0 (fan2)
-85A1 (ding3)
-85A2 (xiao4)
-85A3 (gu3)
-85A4 (xie4)
-85A5 (shu3)
-85A6 (jian4)
-85A7 (kao3)
-85A8 (hong1)
-85A9 (sa4)
-85AA (xin1)
-85AB (xun1)
-85AC (yao4)
-85AD (bai4)
-85AE (sou3)
-85AF (shu3)
-85B0 (xun1)
-85B1 (dui4)
-85B2 (pin2)
-85B3 (wei3)
-85B4 (neng2)
-85B5 (chou2)
-85B6 (mai2)
-85B7 (ru2)
-85B8 (piao1)
-85B9 (tai2)
-85BA (qi2,ji4)
-85BB (zao3)
-85BC (chen2)
-85BD (zhen1)
-85BE (er3)
-85BF (ni3)
-85C0 (ying2)
-85C1 (gao3)
-85C2 (cong4)
-85C3 (xiao1)
-85C4 (qi2)
-85C5 (fa2)
-85C6 (jian3)
-85C7 (xu4)
-85C8 (kui1)
-85C9 (jie4,ji2)
-85CA (bian3)
-85CB (di2)
-85CC (mi4)
-85CD (lan2,la5)
-85CE (jin4)
-85CF (zang4,cang2)
-85D0 (miao3)
-85D1 (qiong2)
-85D2 (qie4)
-85D3 (xian3,li4)
-85D4 (none0)
-85D5 (ou3)
-85D6 (xian2)
-85D7 (su4)
-85D8 (lu:2)
-85D9 (yi4)
-85DA (xu4)
-85DB (xie3)
-85DC (li2)
-85DD (yi4)
-85DE (la3)
-85DF (lei3)
-85E0 (jiao4)
-85E1 (di2)
-85E2 (zhi3)
-85E3 (pi2)
-85E4 (teng2)
-85E5 (yao4,yue4)
-85E6 (mo4,mo2)
-85E7 (huan3)
-85E8 (biao1)
-85E9 (fan1,fan2)
-85EA (sou3)
-85EB (tan2)
-85EC (tui1)
-85ED (qiong2)
-85EE (qiao2)
-85EF (wei4)
-85F0 (liu2)
-85F1 (hui2)
-85F2 (shu1)
-85F3 (gao3)
-85F4 (yun4)
-85F5 (none0)
-85F6 (li4)
-85F7 (zhu1,shu3)
-85F8 (zhu1)
-85F9 (ai3)
-85FA (lin4)
-85FB (zao3)
-85FC (xuan1)
-85FD (chen4)
-85FE (lai4)
-85FF (huo4)
-8600 (tuo4)
-8601 (wu4,e4)
-8602 (rui3)
-8603 (rui3)
-8604 (qi2)
-8605 (heng2)
-8606 (lu2,lu3)
-8607 (su1)
-8608 (tui2)
-8609 (mang2)
-860A (yun4)
-860B (pin2,ping2)
-860C (yu3)
-860D (xun1)
-860E (ji4)
-860F (jiong1)
-8610 (xuan1)
-8611 (mo2)
-8612 (none0)
-8613 (su1)
-8614 (jiong1)
-8615 (none0)
-8616 (nie4)
-8617 (bo4,nie4)
-8618 (rang2)
-8619 (yi4)
-861A (xian3,li4)
-861B (yu2)
-861C (ju2)
-861D (lian4)
-861E (lian4,lian3)
-861F (yin3)
-8620 (qiang2)
-8621 (ying1)
-8622 (long2)
-8623 (tou3)
-8624 (wei3)
-8625 (yue4)
-8626 (ling2)
-8627 (qu2)
-8628 (yao2)
-8629 (fan2)
-862A (mi2)
-862B (lan2)
-862C (kui1)
-862D (lan2)
-862E (ji4)
-862F (dang4)
-8630 (none0)
-8631 (lei4)
-8632 (lei3)
-8633 (tong4)
-8634 (feng1)
-8635 (zhi2)
-8636 (wei4)
-8637 (kui2)
-8638 (zhan4)
-8639 (huai4)
-863A (li2)
-863B (ji4)
-863C (mi2)
-863D (lei3)
-863E (huai4)
-863F (luo2)
-8640 (ji1)
-8641 (nao2)
-8642 (lu4)
-8643 (jian1)
-8644 (none0)
-8645 (none0)
-8646 (lei3)
-8647 (quan3)
-8648 (xiao1)
-8649 (yi4)
-864A (luan2)
-864B (men2)
-864C (bie1)
-864D (hu1)
-864E (hu3,hu4)
-864F (lu3)
-8650 (nu:e4)
-8651 (lu:4)
-8652 (zhi4)
-8653 (xiao1)
-8654 (qian2)
-8655 (chu4,chu3)
-8656 (hu1)
-8657 (xu1)
-8658 (cuo2)
-8659 (fu2)
-865A (xu1)
-865B (xu1)
-865C (lu3)
-865D (hu3,hu4)
-865E (yu2)
-865F (hao4,hao2)
-8660 (jiao1)
-8661 (ju4)
-8662 (guo2)
-8663 (bao4)
-8664 (yan2)
-8665 (zhan4)
-8666 (zhan4)
-8667 (kui1)
-8668 (ban1)
-8669 (xi4)
-866A (shu2)
-866B (chong2,hui3)
-866C (qiu2)
-866D (diao1)
-866E (ji3)
-866F (qiu2)
-8670 (ding1)
-8671 (shi1)
-8672 (none0)
-8673 (di4)
-8674 (zhe2)
-8675 (she2,yi2)
-8676 (yu1)
-8677 (gan1)
-8678 (zi3)
-8679 (hong2,jiang4)
-867A (hui3,hui1)
-867B (meng2)
-867C (ge4)
-867D (sui1)
-867E (xia1,ha2)
-867F (chai4)
-8680 (shi2)
-8681 (yi3)
-8682 (ma3,ma1,ma4)
-8683 (xiang4)
-8684 (fang1)
-8685 (e4)
-8686 (pa1)
-8687 (chi3)
-8688 (qian1)
-8689 (wen2)
-868A (wen2)
-868B (rui4)
-868C (bang4,beng4)
-868D (pi2)
-868E (yue4)
-868F (yue4)
-8690 (jun1)
-8691 (qi2)
-8692 (ran2)
-8693 (yin3)
-8694 (qi2,chi2)
-8695 (can2,tian3)
-8696 (yuan2)
-8697 (jue2)
-8698 (hui2)
-8699 (qian2)
-869A (qi2)
-869B (zhong4)
-869C (ya2)
-869D (hao2)
-869E (mu4)
-869F (wang2)
-86A0 (fen2)
-86A1 (fen2)
-86A2 (hang2)
-86A3 (gong1)
-86A4 (zao3)
-86A5 (fu3)
-86A6 (ran2)
-86A7 (jie4)
-86A8 (fu2)
-86A9 (chi1)
-86AA (dou3)
-86AB (bao4)
-86AC (xian3)
-86AD (ni3)
-86AE (te4)
-86AF (qiu1)
-86B0 (you2)
-86B1 (zha4)
-86B2 (ping2)
-86B3 (chi2)
-86B4 (you4)
-86B5 (he2,ke4)
-86B6 (han1)
-86B7 (ju4)
-86B8 (li4)
-86B9 (fu4)
-86BA (ran2)
-86BB (zha2)
-86BC (gou3)
-86BD (pi2)
-86BE (bo3)
-86BF (xian2)
-86C0 (zhu4)
-86C1 (diao1)
-86C2 (bie3)
-86C3 (bing3)
-86C4 (gu1,gu3)
-86C5 (ran2)
-86C6 (qu1,ju1)
-86C7 (she2,yi2)
-86C8 (tie4)
-86C9 (ling2)
-86CA (gu3)
-86CB (dan4)
-86CC (gu3)
-86CD (ying2)
-86CE (li4)
-86CF (cheng1)
-86D0 (qu1)
-86D1 (mou2)
-86D2 (ge2)
-86D3 (ci4)
-86D4 (hui2)
-86D5 (hui2)
-86D6 (mang2)
-86D7 (fu4)
-86D8 (yang2)
-86D9 (wa1)
-86DA (lie4)
-86DB (zhu1)
-86DC (yi1)
-86DD (xian2)
-86DE (kuo4)
-86DF (jiao1)
-86E0 (li4)
-86E1 (yi4)
-86E2 (ping2)
-86E3 (ji1)
-86E4 (ha2,ge2)
-86E5 (she2)
-86E6 (yi2)
-86E7 (wang3)
-86E8 (mo4)
-86E9 (qiong2)
-86EA (qie4)
-86EB (gui3)
-86EC (gong3)
-86ED (zhi4)
-86EE (man2)
-86EF (none0)
-86F0 (zhe2)
-86F1 (jia2)
-86F2 (nao2)
-86F3 (si1)
-86F4 (qi2)
-86F5 (xing1)
-86F6 (lie4)
-86F7 (qiu2)
-86F8 (shao1,xiao1)
-86F9 (yong3)
-86FA (jia2)
-86FB (tui4,shui4)
-86FC (che1)
-86FD (bai4)
-86FE (e2,yi3)
-86FF (han4)
-8700 (shu3)
-8701 (xuan2)
-8702 (feng1)
-8703 (shen4)
-8704 (zhen4)
-8705 (fu3)
-8706 (xian4,xian3)
-8707 (zhe2,zhe1)
-8708 (wu2)
-8709 (fu2)
-870A (li2)
-870B (lang2)
-870C (bi4)
-870D (chu2)
-870E (yuan1)
-870F (you3)
-8710 (jie2)
-8711 (dan4)
-8712 (yan2)
-8713 (ting2)
-8714 (dian4)
-8715 (tui4)
-8716 (hui2)
-8717 (wo1)
-8718 (zhi1)
-8719 (song1)
-871A (fei1,fei3)
-871B (ju1)
-871C (mi4)
-871D (qi2)
-871E (qi2)
-871F (yu4)
-8720 (jun3)
-8721 (la4,zha4)
-8722 (meng3)
-8723 (qiang1)
-8724 (si1)
-8725 (xi1)
-8726 (lun2)
-8727 (li4)
-8728 (die2)
-8729 (tiao2)
-872A (tao1)
-872B (kun1)
-872C (gan1)
-872D (han4)
-872E (yu4)
-872F (bang4,beng4)
-8730 (fei2)
-8731 (pi2)
-8732 (wei3)
-8733 (dun1)
-8734 (yi4)
-8735 (yuan1)
-8736 (su4)
-8737 (quan2)
-8738 (qian3)
-8739 (rui4)
-873A (ni2)
-873B (qing1)
-873C (wei4)
-873D (liang3)
-873E (guo3)
-873F (wan1,wan3)
-8740 (dong1)
-8741 (e4)
-8742 (ban3)
-8743 (zhuo2)
-8744 (wang3)
-8745 (can2)
-8746 (yang3)
-8747 (ying2)
-8748 (guo1)
-8749 (chan2)
-874A (none0)
-874B (la4,zha4)
-874C (ke1)
-874D (ji2)
-874E (xie1,he2)
-874F (ting2)
-8750 (mai4)
-8751 (xu1)
-8752 (mian2)
-8753 (yu2)
-8754 (jie1)
-8755 (shi2)
-8756 (xuan1)
-8757 (huang2)
-8758 (yan3)
-8759 (bian1)
-875A (rou2)
-875B (wei1)
-875C (fu4)
-875D (yuan2)
-875E (mei4)
-875F (wei4)
-8760 (fu2)
-8761 (ruan3)
-8762 (xie2)
-8763 (you2)
-8764 (you2,qiu2)
-8765 (mao2)
-8766 (xia1,ha2)
-8767 (ying1)
-8768 (shi1)
-8769 (chong2)
-876A (tang1)
-876B (zhu1)
-876C (zong1)
-876D (ti2)
-876E (fu4)
-876F (yuan2)
-8770 (kui2)
-8771 (meng2)
-8772 (la4)
-8773 (du2)
-8774 (hu2)
-8775 (qiu1)
-8776 (die2)
-8777 (li4,xi2)
-8778 (gua1,wo1)
-8779 (yun1)
-877A (ju3)
-877B (nan3)
-877C (lou2)
-877D (chun1)
-877E (rong2)
-877F (ying2)
-8780 (jiang1)
-8781 (tun4)
-8782 (lang2)
-8783 (pang2)
-8784 (si1,shi1)
-8785 (xi1)
-8786 (xi1)
-8787 (xi1)
-8788 (yuan2)
-8789 (weng1)
-878A (lian2)
-878B (sou1)
-878C (ban1)
-878D (rong2)
-878E (rong2)
-878F (ji2)
-8790 (wu1)
-8791 (xiu4)
-8792 (han4)
-8793 (qin2)
-8794 (yi2)
-8795 (bi1)
-8796 (hua2)
-8797 (tang2)
-8798 (yi3)
-8799 (du4)
-879A (nai4)
-879B (he2)
-879C (hu2)
-879D (xi1)
-879E (ma3,ma1,ma4)
-879F (ming2)
-87A0 (yi4)
-87A1 (wen2)
-87A2 (ying2)
-87A3 (teng2,te4)
-87A4 (yu3)
-87A5 (cang1)
-87A6 (none0)
-87A7 (none0)
-87A8 (man3)
-87A9 (none0)
-87AA (shang1)
-87AB (shi4,zhe1)
-87AC (cao2)
-87AD (chi1)
-87AE (di4)
-87AF (ao2)
-87B0 (lu4)
-87B1 (wei4)
-87B2 (zhi4)
-87B3 (tang2)
-87B4 (chen2)
-87B5 (piao1)
-87B6 (qu2)
-87B7 (pi2)
-87B8 (yu2)
-87B9 (jian4)
-87BA (luo2)
-87BB (lou2)
-87BC (qin3)
-87BD (zhong1)
-87BE (yin3)
-87BF (jiang1)
-87C0 (shuai4,shuo4)
-87C1 (wen2)
-87C2 (jiao1)
-87C3 (wan4)
-87C4 (zhe2,zhi2)
-87C5 (zhe4)
-87C6 (ma2,ma5)
-87C7 (ma2)
-87C8 (guo1)
-87C9 (liao4)
-87CA (mao2)
-87CB (xi1)
-87CC (cong1)
-87CD (li2)
-87CE (man3)
-87CF (xiao1)
-87D0 (none0)
-87D1 (zhang1)
-87D2 (mang3)
-87D3 (xiang4)
-87D4 (mo4)
-87D5 (zi1)
-87D6 (si1)
-87D7 (qiu1)
-87D8 (te4)
-87D9 (zhi2)
-87DA (peng2)
-87DB (peng2)
-87DC (jiao3)
-87DD (qu2)
-87DE (bie2)
-87DF (liao3)
-87E0 (pan2)
-87E1 (gui3)
-87E2 (xi3)
-87E3 (ji3)
-87E4 (zhuan1)
-87E5 (huang2)
-87E6 (fei4)
-87E7 (lao2)
-87E8 (jue2)
-87E9 (jue2)
-87EA (hui4)
-87EB (yin2)
-87EC (chan2)
-87ED (jiao1)
-87EE (shan4)
-87EF (rao2,nao2)
-87F0 (xiao1)
-87F1 (wu2)
-87F2 (chong2)
-87F3 (xun2)
-87F4 (si1)
-87F5 (none0)
-87F6 (cheng1)
-87F7 (dang1)
-87F8 (li3,li2)
-87F9 (xie4)
-87FA (shan4)
-87FB (yi3)
-87FC (jing3)
-87FD (da2)
-87FE (chan2)
-87FF (qi4)
-8800 (zi1)
-8801 (xiang4)
-8802 (she4)
-8803 (luo3)
-8804 (qin2)
-8805 (ying2)
-8806 (chai4)
-8807 (li4)
-8808 (ze2)
-8809 (xuan1)
-880A (lian2)
-880B (zhu2)
-880C (ze2)
-880D (xie1)
-880E (mang3)
-880F (xie4,xie3)
-8810 (qi2)
-8811 (rong2)
-8812 (jian3)
-8813 (meng3)
-8814 (hao2)
-8815 (ru2,ruan3)
-8816 (huo4)
-8817 (zhuo2)
-8818 (jie2)
-8819 (bin1)
-881A (he4)
-881B (mie4)
-881C (fan2)
-881D (lei2)
-881E (jie2)
-881F (la4,zha4)
-8820 (mi4)
-8821 (li3,li2)
-8822 (chun3)
-8823 (li4)
-8824 (qiu1)
-8825 (nie4)
-8826 (lu2)
-8827 (du4)
-8828 (xiao1)
-8829 (zhu1)
-882A (long2)
-882B (li4)
-882C (long2)
-882D (feng1)
-882E (ye1)
-882F (pi2)
-8830 (rang2)
-8831 (gu3)
-8832 (juan1)
-8833 (ying1)
-8834 (none0)
-8835 (xi1)
-8836 (can2)
-8837 (qu2)
-8838 (quan2)
-8839 (du4)
-883A (can2)
-883B (man2)
-883C (qu2)
-883D (jie2)
-883E (zhu2)
-883F (zha2)
-8840 (xue4,xie3)
-8841 (huang1)
-8842 (nu:4)
-8843 (pei1)
-8844 (nu:4)
-8845 (xin4)
-8846 (zhong4)
-8847 (mo4)
-8848 (er4)
-8849 (mie4)
-884A (mie4)
-884B (shi4)
-884C (xing2,hang2,hang4,xing4,heng2)
-884D (yan3)
-884E (kan4)
-884F (yuan4)
-8850 (none0)
-8851 (ling2)
-8852 (xuan4)
-8853 (shu4,zhu2)
-8854 (xian2)
-8855 (tong4)
-8856 (long4)
-8857 (jie1)
-8858 (xian2)
-8859 (ya2)
-885A (hu2)
-885B (wei4)
-885C (dao4)
-885D (chong1,chong4)
-885E (wei4)
-885F (dao4)
-8860 (zhun1)
-8861 (heng2)
-8862 (qu2)
-8863 (yi1,yi4,yi3)
-8864 (yi1)
-8865 (bu3)
-8866 (gan3)
-8867 (yu2)
-8868 (biao3)
-8869 (cha4,cha3)
-886A (yi2)
-886B (shan1)
-886C (chen4)
-886D (fu1)
-886E (gun3)
-886F (fen1)
-8870 (shuai1,cui1)
-8871 (jie2,ji2)
-8872 (na4)
-8873 (zhong1)
-8874 (dan3)
-8875 (ri4)
-8876 (zhong4)
-8877 (zhong1)
-8878 (xie4)
-8879 (qi2,zhi1)
-887A (xie2)
-887B (ran2)
-887C (zhi1)
-887D (ren4)
-887E (qin1)
-887F (jin1)
-8880 (jun1)
-8881 (yuan2)
-8882 (mei4)
-8883 (chai4)
-8884 (ao3)
-8885 (niao3)
-8886 (hui1)
-8887 (ran2)
-8888 (jia1)
-8889 (tuo2)
-888A (ling3)
-888B (dai4)
-888C (bao4)
-888D (pao2)
-888E (yao4)
-888F (zuo4)
-8890 (bi4)
-8891 (shao4)
-8892 (tan3)
-8893 (ju3)
-8894 (he4)
-8895 (xue4)
-8896 (xiu4)
-8897 (zhen3)
-8898 (yi2)
-8899 (pa4)
-889A (bo1,fu2)
-889B (di1)
-889C (wa4)
-889D (fu4)
-889E (gun3)
-889F (zhi4)
-88A0 (zhi4)
-88A1 (ran2)
-88A2 (pan4)
-88A3 (yi4)
-88A4 (mao4)
-88A5 (none0)
-88A6 (na4)
-88A7 (kou1)
-88A8 (xuan4)
-88A9 (chan1)
-88AA (qu1)
-88AB (bei4,pi1)
-88AC (yu4)
-88AD (xi2)
-88AE (none0)
-88AF (bo2)
-88B0 (none0)
-88B1 (fu2)
-88B2 (yi2)
-88B3 (chi3)
-88B4 (ku4)
-88B5 (ren4)
-88B6 (jiang4)
-88B7 (jia2,qia1)
-88B8 (cun2)
-88B9 (mo4)
-88BA (jie2)
-88BB (er2)
-88BC (ge1)
-88BD (ru2)
-88BE (zhu1)
-88BF (gui1)
-88C0 (yin1)
-88C1 (cai2)
-88C2 (lie4,lie3)
-88C3 (none0)
-88C4 (none0)
-88C5 (zhuang1)
-88C6 (dang1)
-88C7 (none0)
-88C8 (kun1)
-88C9 (ken4)
-88CA (niao3)
-88CB (shu4)
-88CC (jia2)
-88CD (kun3)
-88CE (cheng2,cheng3)
-88CF (li3)
-88D0 (juan1)
-88D1 (shen1)
-88D2 (pou2)
-88D3 (ge2)
-88D4 (yi4)
-88D5 (yu4)
-88D6 (chen3)
-88D7 (liu2)
-88D8 (qiu2)
-88D9 (qun2)
-88DA (ji4)
-88DB (yi4)
-88DC (bu3)
-88DD (zhuang1)
-88DE (shui4)
-88DF (sha1)
-88E0 (qun2)
-88E1 (li3)
-88E2 (lian2)
-88E3 (lian3)
-88E4 (ku4)
-88E5 (jian3)
-88E6 (fou2)
-88E7 (tan3)
-88E8 (bi4,pi2,bei1)
-88E9 (gun1)
-88EA (tao2)
-88EB (yuan1)
-88EC (ling2)
-88ED (chi3)
-88EE (chang1)
-88EF (chou2)
-88F0 (duo1)
-88F1 (biao3)
-88F2 (liang3)
-88F3 (shang5,chang2)
-88F4 (pei2)
-88F5 (pei2)
-88F6 (fei1)
-88F7 (yuan1)
-88F8 (luo3)
-88F9 (guo3)
-88FA (yan3)
-88FB (du3)
-88FC (ti4,xi1,xi2)
-88FD (zhi4)
-88FE (ju1)
-88FF (qi3)
-8900 (ji4)
-8901 (zhi2)
-8902 (gua4)
-8903 (ken4)
-8904 (none0)
-8905 (ti4)
-8906 (shi4)
-8907 (fu4)
-8908 (chong2)
-8909 (xie1)
-890A (bian3)
-890B (die2)
-890C (kun1,hui1)
-890D (duan1)
-890E (xiu4)
-890F (xiu4)
-8910 (he4,he2)
-8911 (yuan4)
-8912 (bao1)
-8913 (bao3)
-8914 (fu4)
-8915 (yu2)
-8916 (tuan4)
-8917 (yan3)
-8918 (hui1)
-8919 (bei4)
-891A (chu3,zhu3)
-891B (lu:3)
-891C (none0)
-891D (none0)
-891E (yun3)
-891F (ta1)
-8920 (gou1)
-8921 (da1)
-8922 (huai2)
-8923 (rong2)
-8924 (yuan4)
-8925 (ru4)
-8926 (nai4)
-8927 (jiong3)
-8928 (suo3)
-8929 (ban1)
-892A (tun4,tui4)
-892B (chi3)
-892C (sang3)
-892D (niao3)
-892E (ying1)
-892F (jie4)
-8930 (qian1)
-8931 (huai2)
-8932 (ku4)
-8933 (lian2)
-8934 (lan2)
-8935 (li2)
-8936 (zhe3,zhe2,xi2)
-8937 (shi1)
-8938 (lu:3)
-8939 (yi4)
-893A (die1)
-893B (xie4)
-893C (xian1)
-893D (wei4)
-893E (biao3)
-893F (cao2)
-8940 (ji1)
-8941 (qiang3)
-8942 (sen1)
-8943 (bao1)
-8944 (xiang1)
-8945 (none0)
-8946 (pu2)
-8947 (jian3)
-8948 (zhuan4)
-8949 (jian4)
-894A (zui4)
-894B (ji2)
-894C (dan1)
-894D (za2)
-894E (fan2)
-894F (bo1)
-8950 (xiang4)
-8951 (xin2)
-8952 (bie2,bi4)
-8953 (rao2)
-8954 (man3)
-8955 (lan2)
-8956 (ao3)
-8957 (duo2)
-8958 (hui4)
-8959 (cao4)
-895A (sui4)
-895B (nong2)
-895C (chan1)
-895D (lian4,lian3)
-895E (bi4)
-895F (jin1)
-8960 (dang1)
-8961 (shu2)
-8962 (tan3)
-8963 (bi4)
-8964 (lan2)
-8965 (pu2)
-8966 (ru2)
-8967 (zhi3)
-8968 (none0)
-8969 (shu3)
-896A (wa4)
-896B (shi4)
-896C (bai3)
-896D (xie2)
-896E (bo2)
-896F (chen4)
-8970 (lai3)
-8971 (long2)
-8972 (xi2)
-8973 (xian1)
-8974 (lan2)
-8975 (zhe2)
-8976 (dai4)
-8977 (none0)
-8978 (zan4)
-8979 (shi1)
-897A (jian3)
-897B (pan4)
-897C (yi4)
-897D (none0)
-897E (ya4)
-897F (xi1)
-8980 (xi1)
-8981 (yao4,yao1)
-8982 (feng3)
-8983 (tan2,qin2)
-8984 (none0)
-8985 (none0)
-8986 (fu4)
-8987 (ba4)
-8988 (he2)
-8989 (ji1)
-898A (ji1)
-898B (jian4,xian4)
-898C (guan1)
-898D (bian4)
-898E (yan4)
-898F (gui1)
-8990 (jue2,jiao4)
-8991 (pian3)
-8992 (mao2)
-8993 (mi4)
-8994 (mi4)
-8995 (mie4)
-8996 (shi4)
-8997 (si1)
-8998 (zhan1,chan1)
-8999 (luo2)
-899A (jue2,jiao4)
-899B (mo4)
-899C (tiao4)
-899D (lian2)
-899E (yao4)
-899F (zhi4)
-89A0 (jun1)
-89A1 (xi2)
-89A2 (shan3)
-89A3 (wei1)
-89A4 (xi4)
-89A5 (tian3)
-89A6 (yu2)
-89A7 (lan3)
-89A8 (e4)
-89A9 (du3)
-89AA (qin1,qing4)
-89AB (pang3)
-89AC (ji4)
-89AD (ming2)
-89AE (ping1)
-89AF (gou4)
-89B0 (qu4,qu1)
-89B1 (zhan4)
-89B2 (jin3,jin4)
-89B3 (guan1,guan4)
-89B4 (deng1)
-89B5 (jian4)
-89B6 (luo2)
-89B7 (qu4,qu1)
-89B8 (jian4)
-89B9 (wei2)
-89BA (jue2,jiao4)
-89BB (qu4)
-89BC (luo2)
-89BD (lan3)
-89BE (shen3)
-89BF (di2)
-89C0 (guan1,guan4)
-89C1 (jian4,xian4)
-89C2 (guan1,guan4)
-89C3 (yan4)
-89C4 (gui1)
-89C5 (mi4)
-89C6 (shi4)
-89C7 (chan1)
-89C8 (lan3)
-89C9 (jue2,jiao4)
-89CA (ji4)
-89CB (xi2)
-89CC (di2)
-89CD (tian3)
-89CE (yu2)
-89CF (gou4)
-89D0 (jin4)
-89D1 (qu4,qu1)
-89D2 (jiao3,jue2,jia3)
-89D3 (jiu1)
-89D4 (jin1)
-89D5 (cu1)
-89D6 (jue2)
-89D7 (zhi4)
-89D8 (chao4)
-89D9 (ji2)
-89DA (gu1)
-89DB (dan4)
-89DC (zui3,zi1)
-89DD (di3)
-89DE (shang1)
-89DF (hua4)
-89E0 (quan2)
-89E1 (ge2)
-89E2 (zhi4)
-89E3 (jie3,jie4,xie4)
-89E4 (gui3)
-89E5 (gong1)
-89E6 (chu4)
-89E7 (jie3,jie4,xie4)
-89E8 (huan4)
-89E9 (qiu2)
-89EA (xing1)
-89EB (su4)
-89EC (ni2)
-89ED (ji1)
-89EE (lu4)
-89EF (zhi4)
-89F0 (zhu1)
-89F1 (bi4)
-89F2 (xing1)
-89F3 (hu2)
-89F4 (shang1)
-89F5 (gong1)
-89F6 (zhi4)
-89F7 (xue2)
-89F8 (chu4)
-89F9 (xi1)
-89FA (yi2)
-89FB (li4)
-89FC (jue2)
-89FD (xi1)
-89FE (yan4)
-89FF (xi1)
-8A00 (yan2)
-8A01 (yan2)
-8A02 (ding4)
-8A03 (fu4)
-8A04 (qiu2)
-8A05 (qiu2)
-8A06 (jiao4)
-8A07 (hong1)
-8A08 (ji4)
-8A09 (fan4)
-8A0A (xun4)
-8A0B (diao4)
-8A0C (hong2,hong4)
-8A0D (cha4)
-8A0E (tao3)
-8A0F (xu1)
-8A10 (jie2)
-8A11 (yi2)
-8A12 (ren4)
-8A13 (xun4)
-8A14 (yin2)
-8A15 (shan4)
-8A16 (qi4)
-8A17 (tuo1)
-8A18 (ji4)
-8A19 (xun4)
-8A1A (yin2)
-8A1B (e2)
-8A1C (fen1)
-8A1D (ya4)
-8A1E (yao1)
-8A1F (song4)
-8A20 (shen3)
-8A21 (yin2)
-8A22 (xin1)
-8A23 (jue2)
-8A24 (xiao2)
-8A25 (ne4,na4)
-8A26 (chen2)
-8A27 (you2)
-8A28 (zhi3)
-8A29 (xiong1)
-8A2A (fang3)
-8A2B (xin4)
-8A2C (chao1)
-8A2D (she4)
-8A2E (xian1)
-8A2F (sa3)
-8A30 (zhun1)
-8A31 (xu3,hu3)
-8A32 (yi4)
-8A33 (yi4)
-8A34 (su4)
-8A35 (chi1)
-8A36 (he1)
-8A37 (shen1)
-8A38 (he2)
-8A39 (xu4)
-8A3A (zhen3,zhen1)
-8A3B (zhu4)
-8A3C (zheng4)
-8A3D (gou4)
-8A3E (zi3,zi1)
-8A3F (zi3)
-8A40 (zhan1)
-8A41 (gu3)
-8A42 (fu4)
-8A43 (jian3)
-8A44 (die2)
-8A45 (ling2)
-8A46 (di3)
-8A47 (yang4)
-8A48 (li4)
-8A49 (nao2)
-8A4A (pan4)
-8A4B (zhou4)
-8A4C (gan4)
-8A4D (shi4)
-8A4E (ju4)
-8A4F (ao4)
-8A50 (zha4)
-8A51 (tuo1)
-8A52 (yi2)
-8A53 (qu3)
-8A54 (zhao4)
-8A55 (ping2)
-8A56 (bi4)
-8A57 (xiong4)
-8A58 (chu4,qu1)
-8A59 (ba2)
-8A5A (da2)
-8A5B (zu3)
-8A5C (tao1)
-8A5D (zhu3)
-8A5E (ci2)
-8A5F (zhe2)
-8A60 (yong3)
-8A61 (xu3)
-8A62 (xun2)
-8A63 (yi4)
-8A64 (huang3)
-8A65 (he2)
-8A66 (shi4)
-8A67 (cha2)
-8A68 (jiao1)
-8A69 (shi1)
-8A6A (hen3)
-8A6B (cha4)
-8A6C (gou4)
-8A6D (gui3)
-8A6E (quan2)
-8A6F (hui4)
-8A70 (jie2)
-8A71 (hua4)
-8A72 (gai1)
-8A73 (xiang2)
-8A74 (hui4)
-8A75 (shen1)
-8A76 (chou2)
-8A77 (tong2)
-8A78 (mi2)
-8A79 (zhan1)
-8A7A (ming2)
-8A7B (e4)
-8A7C (hui1)
-8A7D (yan2)
-8A7E (xiong1)
-8A7F (gua4)
-8A80 (er4)
-8A81 (beng3)
-8A82 (tiao3,diao4)
-8A83 (chi3)
-8A84 (lei3)
-8A85 (zhu1)
-8A86 (kuang1)
-8A87 (kua1)
-8A88 (wu2)
-8A89 (yu4)
-8A8A (teng2)
-8A8B (ji4)
-8A8C (zhi4)
-8A8D (ren4)
-8A8E (su4)
-8A8F (lang3)
-8A90 (e2)
-8A91 (kuang2)
-8A92 (e^1,e^2,e^3,e^4)
-8A93 (shi4)
-8A94 (ting3)
-8A95 (dan4)
-8A96 (bei4)
-8A97 (chan2)
-8A98 (you4)
-8A99 (heng2)
-8A9A (qiao4)
-8A9B (qin1)
-8A9C (shua4)
-8A9D (an1)
-8A9E (yu3,yu4)
-8A9F (xiao4)
-8AA0 (cheng2)
-8AA1 (jie4)
-8AA2 (xian4)
-8AA3 (wu1,wu2)
-8AA4 (wu4)
-8AA5 (gao4)
-8AA6 (song4)
-8AA7 (pu3)
-8AA8 (hui4,hui3)
-8AA9 (jing4)
-8AAA (shuo1,shui4,yue4)
-8AAB (zhen4)
-8AAC (shuo1,shui4,yue4)
-8AAD (du2,dou4)
-8AAE (none0)
-8AAF (chang4)
-8AB0 (shui2,shei2)
-8AB1 (jie2)
-8AB2 (ke4)
-8AB3 (qu1)
-8AB4 (cong2)
-8AB5 (xiao2)
-8AB6 (sui4)
-8AB7 (wang3)
-8AB8 (xuan2)
-8AB9 (fei3)
-8ABA (chi1)
-8ABB (ta4)
-8ABC (yi2,yi4)
-8ABD (na2)
-8ABE (yin2)
-8ABF (diao4,tiao2)
-8AC0 (pi3)
-8AC1 (chuo4)
-8AC2 (chan3)
-8AC3 (chen1)
-8AC4 (zhun1)
-8AC5 (ji1)
-8AC6 (qi1)
-8AC7 (tan2)
-8AC8 (chui4)
-8AC9 (wei3)
-8ACA (ju1)
-8ACB (qing3)
-8ACC (jian4)
-8ACD (zheng1,zheng4)
-8ACE (ze2)
-8ACF (zou1)
-8AD0 (qian1)
-8AD1 (zhuo2)
-8AD2 (liang4)
-8AD3 (jian4)
-8AD4 (zhu4)
-8AD5 (hao2)
-8AD6 (lun4,lun2)
-8AD7 (shen3)
-8AD8 (biao3)
-8AD9 (huai4)
-8ADA (pian2)
-8ADB (yu2)
-8ADC (die2)
-8ADD (xu3)
-8ADE (pian2,pian3)
-8ADF (shi4)
-8AE0 (xuan1)
-8AE1 (shi4)
-8AE2 (hun4)
-8AE3 (hua4)
-8AE4 (e4)
-8AE5 (zhong4)
-8AE6 (di4)
-8AE7 (xie2)
-8AE8 (fu2)
-8AE9 (pu3)
-8AEA (ting2)
-8AEB (jian4)
-8AEC (qi3)
-8AED (yu4)
-8AEE (zi1)
-8AEF (chuan2)
-8AF0 (xi3)
-8AF1 (hui4)
-8AF2 (yin1)
-8AF3 (an1)
-8AF4 (xian2)
-8AF5 (nan2)
-8AF6 (chen2)
-8AF7 (feng1,feng3,feng4)
-8AF8 (zhu1)
-8AF9 (yang2)
-8AFA (yan4)
-8AFB (heng1,heng2)
-8AFC (xuan1)
-8AFD (ge2)
-8AFE (nuo4)
-8AFF (qi4)
-8B00 (mou2)
-8B01 (ye4)
-8B02 (wei4)
-8B03 (none0)
-8B04 (teng2)
-8B05 (zou1,zhou1)
-8B06 (shan4)
-8B07 (jian3)
-8B08 (bo2)
-8B09 (none0)
-8B0A (huang3)
-8B0B (huo4)
-8B0C (ge1)
-8B0D (ying2)
-8B0E (mi2,mei4)
-8B0F (xiao3,sou3)
-8B10 (mi4)
-8B11 (xi4)
-8B12 (qiang1)
-8B13 (chen1)
-8B14 (nu:e4,xue4)
-8B15 (si1)
-8B16 (su4)
-8B17 (bang4)
-8B18 (chi2)
-8B19 (qian1)
-8B1A (shi4,yi4)
-8B1B (jiang3)
-8B1C (yuan4)
-8B1D (xie4)
-8B1E (xue4)
-8B1F (tao1)
-8B20 (yao2)
-8B21 (yao2)
-8B22 (hu4)
-8B23 (yu2)
-8B24 (biao1)
-8B25 (cong4)
-8B26 (qing3,qing4)
-8B27 (li2)
-8B28 (mo2)
-8B29 (mo4)
-8B2A (shang1)
-8B2B (zhe2)
-8B2C (miu4)
-8B2D (jian3)
-8B2E (ze2)
-8B2F (zha1)
-8B30 (lian2)
-8B31 (lou2)
-8B32 (can1)
-8B33 (ou1)
-8B34 (guan4)
-8B35 (xi2)
-8B36 (zhuo2)
-8B37 (ao2)
-8B38 (ao2)
-8B39 (jin3)
-8B3A (zhe2)
-8B3B (yi2)
-8B3C (hu1)
-8B3D (jiang4)
-8B3E (man2,man4)
-8B3F (chao2)
-8B40 (han4)
-8B41 (hua2)
-8B42 (chan3)
-8B43 (xu1)
-8B44 (zeng1)
-8B45 (se4)
-8B46 (xi1)
-8B47 (she1)
-8B48 (dui4)
-8B49 (zheng4)
-8B4A (nao2)
-8B4B (lan2)
-8B4C (e2)
-8B4D (ying4)
-8B4E (jue2)
-8B4F (ji1)
-8B50 (zun3)
-8B51 (jiao3)
-8B52 (bo4)
-8B53 (hui4)
-8B54 (zhuan4)
-8B55 (wu2)
-8B56 (jian4,zen4)
-8B57 (zha2)
-8B58 (shi4,zhi4)
-8B59 (qiao2,qiao4)
-8B5A (tan2)
-8B5B (zen4)
-8B5C (pu3)
-8B5D (sheng2)
-8B5E (xuan1)
-8B5F (zao4)
-8B60 (zhan1)
-8B61 (dang3)
-8B62 (sui4)
-8B63 (qian1)
-8B64 (ji1)
-8B65 (jiao4)
-8B66 (jing3)
-8B67 (lian2)
-8B68 (nou4)
-8B69 (yi1)
-8B6A (ai4)
-8B6B (zhan1)
-8B6C (pi4)
-8B6D (hui3)
-8B6E (hua4)
-8B6F (yi4)
-8B70 (yi4)
-8B71 (shan4)
-8B72 (rang4)
-8B73 (nou4)
-8B74 (qian3)
-8B75 (zhui4)
-8B76 (ta4)
-8B77 (hu4)
-8B78 (zhou1)
-8B79 (hao2)
-8B7A (ni3)
-8B7B (ying1)
-8B7C (jian4,jian1)
-8B7D (yu4)
-8B7E (jian3)
-8B7F (hui4)
-8B80 (du2,dou4)
-8B81 (zhe2)
-8B82 (xuan4)
-8B83 (zan4)
-8B84 (lei3)
-8B85 (shen3)
-8B86 (wei4)
-8B87 (chan3)
-8B88 (li4)
-8B89 (yi2)
-8B8A (bian4)
-8B8B (zhe2)
-8B8C (yan4)
-8B8D (e4)
-8B8E (chou2)
-8B8F (wei4)
-8B90 (chou2)
-8B91 (yao4)
-8B92 (chan2)
-8B93 (rang4)
-8B94 (yin3)
-8B95 (lan2)
-8B96 (chen4)
-8B97 (huo4)
-8B98 (zhe2)
-8B99 (huan1)
-8B9A (zan4)
-8B9B (yi4)
-8B9C (dang3)
-8B9D (zhan1)
-8B9E (yan4)
-8B9F (du2)
-8BA0 (yan2)
-8BA1 (ji4)
-8BA2 (ding4)
-8BA3 (fu4)
-8BA4 (ren4)
-8BA5 (ji1)
-8BA6 (jie2)
-8BA7 (hong4)
-8BA8 (tao3)
-8BA9 (rang4)
-8BAA (shan4)
-8BAB (qi4)
-8BAC (tuo1)
-8BAD (xun4)
-8BAE (yi4)
-8BAF (xun4)
-8BB0 (ji4)
-8BB1 (ren4)
-8BB2 (jiang3)
-8BB3 (hui4)
-8BB4 (ou1)
-8BB5 (ju4)
-8BB6 (ya4)
-8BB7 (ne4)
-8BB8 (xu3)
-8BB9 (e2)
-8BBA (lun4,lun2)
-8BBB (xiong1)
-8BBC (song4)
-8BBD (feng3)
-8BBE (she4)
-8BBF (fang3)
-8BC0 (jue2)
-8BC1 (zheng4)
-8BC2 (gu3)
-8BC3 (he1)
-8BC4 (ping2)
-8BC5 (zu3)
-8BC6 (shi1,zhi4)
-8BC7 (xiong4)
-8BC8 (zha4)
-8BC9 (su4)
-8BCA (zhen3)
-8BCB (di3)
-8BCC (zhou1)
-8BCD (ci2)
-8BCE (qu1)
-8BCF (zhao4)
-8BD0 (bi4)
-8BD1 (yi4)
-8BD2 (yi2)
-8BD3 (kuang1)
-8BD4 (lei3)
-8BD5 (shi4)
-8BD6 (gua4)
-8BD7 (shi1)
-8BD8 (jie2,ji2)
-8BD9 (hui1)
-8BDA (cheng2)
-8BDB (zhu1)
-8BDC (shen1)
-8BDD (hua4)
-8BDE (dan4)
-8BDF (gou4)
-8BE0 (quan2)
-8BE1 (gui3)
-8BE2 (xun2)
-8BE3 (yi4)
-8BE4 (zheng4)
-8BE5 (gai1)
-8BE6 (xiang2)
-8BE7 (cha4)
-8BE8 (hun4)
-8BE9 (xu3)
-8BEA (zhou1)
-8BEB (jie4)
-8BEC (wu1)
-8BED (yu3,yu4)
-8BEE (qiao4)
-8BEF (wu4)
-8BF0 (gao4)
-8BF1 (you4)
-8BF2 (hui4)
-8BF3 (kuang2)
-8BF4 (shuo1,shui4,yue4)
-8BF5 (song4)
-8BF6 (ei4,ei2,ei3,ai3,e^1,e^2,e^3,e^4)
-8BF7 (qing3)
-8BF8 (zhu1)
-8BF9 (zou1)
-8BFA (nuo4)
-8BFB (du2,dou4)
-8BFC (zhuo2)
-8BFD (fei3)
-8BFE (ke4)
-8BFF (wei3)
-8C00 (yu2)
-8C01 (shei2,shui2)
-8C02 (shen3)
-8C03 (diao4,tiao2)
-8C04 (chan3)
-8C05 (liang4)
-8C06 (zhun1)
-8C07 (sui4)
-8C08 (tan2)
-8C09 (shen3)
-8C0A (yi4)
-8C0B (mou2)
-8C0C (chen2)
-8C0D (die2)
-8C0E (huang3)
-8C0F (jian4)
-8C10 (xie2)
-8C11 (xue4)
-8C12 (ye4)
-8C13 (wei4)
-8C14 (e4)
-8C15 (yu4)
-8C16 (xuan1)
-8C17 (chan2)
-8C18 (zi1)
-8C19 (an1)
-8C1A (yan4)
-8C1B (di4)
-8C1C (mi2,mei4)
-8C1D (pian3)
-8C1E (xu3)
-8C1F (mo2)
-8C20 (dang3)
-8C21 (su4)
-8C22 (xie4)
-8C23 (yao2)
-8C24 (bang4)
-8C25 (shi4)
-8C26 (qian1)
-8C27 (mi4)
-8C28 (jin3)
-8C29 (man2,man4)
-8C2A (zhe2)
-8C2B (jian3)
-8C2C (miu4)
-8C2D (tan2)
-8C2E (jian4,zen4)
-8C2F (qiao2,qiao4)
-8C30 (lan2)
-8C31 (pu3)
-8C32 (jue2)
-8C33 (yan4)
-8C34 (qian3)
-8C35 (zhan1)
-8C36 (chen4)
-8C37 (gu3,yu4)
-8C38 (qian1)
-8C39 (hong2)
-8C3A (ya2)
-8C3B (jue2)
-8C3C (hong2)
-8C3D (han1)
-8C3E (hong1)
-8C3F (qi1,xi1)
-8C40 (xi1)
-8C41 (huo4,huo1,hua2)
-8C42 (liao2)
-8C43 (han3)
-8C44 (du2)
-8C45 (long2)
-8C46 (dou4)
-8C47 (jiang1)
-8C48 (qi3,kai3)
-8C49 (chi3)
-8C4A (feng1,li3)
-8C4B (deng1)
-8C4C (wan1)
-8C4D (bi1)
-8C4E (shu4)
-8C4F (xian4)
-8C50 (feng1)
-8C51 (zhi4)
-8C52 (zhi4)
-8C53 (yan4)
-8C54 (yan4)
-8C55 (shi3)
-8C56 (chu4)
-8C57 (hui1)
-8C58 (tun2)
-8C59 (yi4)
-8C5A (tun2)
-8C5B (yi4)
-8C5C (jian1)
-8C5D (ba1)
-8C5E (hou4)
-8C5F (e4)
-8C60 (cu2)
-8C61 (xiang4)
-8C62 (huan4)
-8C63 (jian1)
-8C64 (ken3)
-8C65 (gai1)
-8C66 (qu2)
-8C67 (fu1)
-8C68 (xi1)
-8C69 (bin1)
-8C6A (hao2)
-8C6B (yu4)
-8C6C (zhu1)
-8C6D (jia1)
-8C6E (fen2)
-8C6F (xi1)
-8C70 (hu4)
-8C71 (wen1)
-8C72 (huan2)
-8C73 (bin1)
-8C74 (di2)
-8C75 (zong1)
-8C76 (fen2)
-8C77 (yi4)
-8C78 (zhi4)
-8C79 (bao4)
-8C7A (chai2)
-8C7B (han4,an4)
-8C7C (pi2)
-8C7D (na4)
-8C7E (pi1)
-8C7F (gou3)
-8C80 (duo4)
-8C81 (you4)
-8C82 (diao1)
-8C83 (mo4)
-8C84 (si4)
-8C85 (xiu1)
-8C86 (huan2)
-8C87 (kun1)
-8C88 (he2)
-8C89 (he2,hao2,mo4)
-8C8A (mo4)
-8C8B (an4)
-8C8C (mao4)
-8C8D (li2)
-8C8E (ni2)
-8C8F (bi3)
-8C90 (yu3)
-8C91 (jia1)
-8C92 (tuan1)
-8C93 (mao1)
-8C94 (pi2)
-8C95 (xi1)
-8C96 (e4)
-8C97 (ju4)
-8C98 (mo4)
-8C99 (chu1)
-8C9A (tan2)
-8C9B (huan1)
-8C9C (qu2)
-8C9D (bei4)
-8C9E (zhen1)
-8C9F (yuan2,yun2,yun4)
-8CA0 (fu4)
-8CA1 (cai2)
-8CA2 (gong4)
-8CA3 (te4)
-8CA4 (yi2)
-8CA5 (hang2)
-8CA6 (wan4)
-8CA7 (pin2)
-8CA8 (huo4)
-8CA9 (fan4)
-8CAA (tan1)
-8CAB (guan4)
-8CAC (ze2,zhai4)
-8CAD (zhi4)
-8CAE (er4)
-8CAF (zhu3,zhu4)
-8CB0 (shi4)
-8CB1 (bi4)
-8CB2 (zi1)
-8CB3 (er4)
-8CB4 (gui4)
-8CB5 (pian1)
-8CB6 (bian3)
-8CB7 (mai3)
-8CB8 (dai4)
-8CB9 (sheng4)
-8CBA (kuang4)
-8CBB (fei4)
-8CBC (tie1)
-8CBD (yi2)
-8CBE (chi2,chi1)
-8CBF (mao4)
-8CC0 (he4)
-8CC1 (bi4,ben1)
-8CC2 (lu4)
-8CC3 (lin4,ren4)
-8CC4 (hui4,hui3)
-8CC5 (gai1)
-8CC6 (pian2)
-8CC7 (zi1)
-8CC8 (jia3,gu3,jia4)
-8CC9 (xu4)
-8CCA (zei2,ze2)
-8CCB (jiao3)
-8CCC (gai1)
-8CCD (zang1)
-8CCE (jian4)
-8CCF (ying4)
-8CD0 (xun4)
-8CD1 (zhen4)
-8CD2 (she1)
-8CD3 (bin1)
-8CD4 (bin1)
-8CD5 (qiu2)
-8CD6 (she1)
-8CD7 (chuan4)
-8CD8 (zang1)
-8CD9 (zhou1)
-8CDA (lai4)
-8CDB (zan4)
-8CDC (si4,ci4)
-8CDD (chen1)
-8CDE (shang3)
-8CDF (tian3)
-8CE0 (pei2)
-8CE1 (geng1)
-8CE2 (xian2)
-8CE3 (mai4)
-8CE4 (jian4)
-8CE5 (sui4)
-8CE6 (fu4)
-8CE7 (dan3)
-8CE8 (cong2)
-8CE9 (cong2)
-8CEA (zhi2,zhi4)
-8CEB (ji1)
-8CEC (zhang4)
-8CED (du3)
-8CEE (jin4)
-8CEF (xiong1)
-8CF0 (shun3)
-8CF1 (yun3)
-8CF2 (bao3)
-8CF3 (zai1)
-8CF4 (lai4)
-8CF5 (feng4)
-8CF6 (cang4)
-8CF7 (ji1)
-8CF8 (sheng4)
-8CF9 (ai4)
-8CFA (zhuan4,zuan4)
-8CFB (fu4)
-8CFC (gou4)
-8CFD (sai4)
-8CFE (ze2)
-8CFF (liao2)
-8D00 (wei4)
-8D01 (bai4)
-8D02 (chen3)
-8D03 (zhuan4)
-8D04 (zhi4)
-8D05 (zhui4)
-8D06 (biao1)
-8D07 (yun1)
-8D08 (zeng4)
-8D09 (tan3)
-8D0A (zan4)
-8D0B (yan4)
-8D0C (none0)
-8D0D (shan4)
-8D0E (wan4)
-8D0F (ying2)
-8D10 (jin4)
-8D11 (gan3)
-8D12 (xian2)
-8D13 (zang1)
-8D14 (bi4)
-8D15 (du2)
-8D16 (shu2)
-8D17 (yan4)
-8D18 (none0)
-8D19 (xuan4)
-8D1A (long4)
-8D1B (gan4)
-8D1C (zang1)
-8D1D (bei4)
-8D1E (zhen1)
-8D1F (fu4)
-8D20 (yuan2,yun2,yun4)
-8D21 (gong4)
-8D22 (cai2)
-8D23 (ze2)
-8D24 (xian2)
-8D25 (bai4)
-8D26 (zhang4)
-8D27 (huo4)
-8D28 (zhi4)
-8D29 (fan4)
-8D2A (tan1)
-8D2B (pin2)
-8D2C (bian3)
-8D2D (gou4)
-8D2E (zhu4)
-8D2F (guan4)
-8D30 (er4)
-8D31 (jian4)
-8D32 (bi4,ben1)
-8D33 (shi4)
-8D34 (tie1)
-8D35 (gui4)
-8D36 (kuang4)
-8D37 (dai4)
-8D38 (mao4)
-8D39 (fei4)
-8D3A (he4)
-8D3B (yi2)
-8D3C (zei2)
-8D3D (zhi4)
-8D3E (jia3,gu3)
-8D3F (hui4)
-8D40 (zi1)
-8D41 (lin4)
-8D42 (lu4)
-8D43 (zang1)
-8D44 (zi1)
-8D45 (gai1)
-8D46 (jin4)
-8D47 (qiu2)
-8D48 (zhen4)
-8D49 (lai4)
-8D4A (she1)
-8D4B (fu4)
-8D4C (du3)
-8D4D (ji1)
-8D4E (shu2)
-8D4F (shang3)
-8D50 (ci4)
-8D51 (bi4)
-8D52 (zhou1)
-8D53 (geng1)
-8D54 (pei2)
-8D55 (dan3)
-8D56 (lai4)
-8D57 (feng4)
-8D58 (zhui4)
-8D59 (fu4)
-8D5A (zhuan4,zuan4)
-8D5B (sai4)
-8D5C (ze2)
-8D5D (yan4)
-8D5E (zan4)
-8D5F (yun1)
-8D60 (zeng4)
-8D61 (shan4)
-8D62 (ying2)
-8D63 (gan4)
-8D64 (chi4)
-8D65 (xi1)
-8D66 (she4)
-8D67 (nan3)
-8D68 (xiong2)
-8D69 (xi4)
-8D6A (cheng1)
-8D6B (he4)
-8D6C (cheng1)
-8D6D (zhe3)
-8D6E (xia2)
-8D6F (tang2)
-8D70 (zou3)
-8D71 (zou3)
-8D72 (li4)
-8D73 (jiu1,jiu3)
-8D74 (fu4)
-8D75 (zhao4)
-8D76 (gan3)
-8D77 (qi3)
-8D78 (shan4)
-8D79 (qiong2)
-8D7A (qin2)
-8D7B (xian3)
-8D7C (ci1)
-8D7D (jue2)
-8D7E (qin3)
-8D7F (chi2)
-8D80 (ci1)
-8D81 (chen4)
-8D82 (chen4)
-8D83 (die2)
-8D84 (ju1,qie4,qie5,ju4)
-8D85 (chao1)
-8D86 (di1)
-8D87 (se4)
-8D88 (zhan1)
-8D89 (zhu2)
-8D8A (yue4)
-8D8B (qu1)
-8D8C (jie2)
-8D8D (chi2)
-8D8E (chu2)
-8D8F (gua1)
-8D90 (xue4)
-8D91 (zi1)
-8D92 (tiao2)
-8D93 (duo3)
-8D94 (lie4)
-8D95 (gan3)
-8D96 (suo1)
-8D97 (cu4)
-8D98 (xi2)
-8D99 (zhao4)
-8D9A (su4)
-8D9B (yin3)
-8D9C (ju2)
-8D9D (jian4)
-8D9E (que4)
-8D9F (tang4,tang1)
-8DA0 (chuo4)
-8DA1 (cui3)
-8DA2 (lu4)
-8DA3 (qu4,cu4)
-8DA4 (dang4)
-8DA5 (qiu1)
-8DA6 (zi1)
-8DA7 (ti2)
-8DA8 (qu1,cu4)
-8DA9 (chi4)
-8DAA (huang2)
-8DAB (qiao2)
-8DAC (qiao1)
-8DAD (yao4)
-8DAE (zao4)
-8DAF (yue4)
-8DB0 (none0)
-8DB1 (zan3)
-8DB2 (zan3,zan4)
-8DB3 (zu2,ju4)
-8DB4 (pa1)
-8DB5 (bao4,bo1)
-8DB6 (ku4)
-8DB7 (he2)
-8DB8 (dun3)
-8DB9 (jue2)
-8DBA (fu1)
-8DBB (chen3)
-8DBC (jian3)
-8DBD (fang4)
-8DBE (zhi3)
-8DBF (ta1)
-8DC0 (yue4)
-8DC1 (pa2)
-8DC2 (qi2)
-8DC3 (yue4)
-8DC4 (qiang1,qiang4)
-8DC5 (tuo4)
-8DC6 (tai2)
-8DC7 (yi4)
-8DC8 (nian3)
-8DC9 (ling2)
-8DCA (mei4)
-8DCB (ba2)
-8DCC (die1,die2)
-8DCD (ku1)
-8DCE (tuo2)
-8DCF (jia1)
-8DD0 (ci3)
-8DD1 (pao3,pao2)
-8DD2 (qia3)
-8DD3 (zhu4)
-8DD4 (ju1)
-8DD5 (die2)
-8DD6 (zhi2,zhi1)
-8DD7 (fu1)
-8DD8 (pan2)
-8DD9 (ju3)
-8DDA (shan1)
-8DDB (bo3)
-8DDC (ni2)
-8DDD (ju4)
-8DDE (li4,luo4)
-8DDF (gen1)
-8DE0 (yi2)
-8DE1 (ji1)
-8DE2 (dai4)
-8DE3 (xian3)
-8DE4 (jiao1)
-8DE5 (duo4)
-8DE6 (chu2)
-8DE7 (quan2)
-8DE8 (kua4)
-8DE9 (zhuai3,shi4)
-8DEA (gui4)
-8DEB (qiong2)
-8DEC (kui3)
-8DED (xiang2)
-8DEE (chi4)
-8DEF (lu4)
-8DF0 (beng4)
-8DF1 (zhi4)
-8DF2 (jia2)
-8DF3 (tiao4)
-8DF4 (cai3)
-8DF5 (jian4)
-8DF6 (da5)
-8DF7 (qiao1)
-8DF8 (bi4)
-8DF9 (xian1)
-8DFA (duo4)
-8DFB (ji1)
-8DFC (ju2)
-8DFD (ji4)
-8DFE (shu2)
-8DFF (tu2)
-8E00 (chu4)
-8E01 (xing4)
-8E02 (nie4)
-8E03 (xiao1)
-8E04 (bo2)
-8E05 (xue2)
-8E06 (qun1)
-8E07 (mou3)
-8E08 (shu1)
-8E09 (liang4,liang2)
-8E0A (yong3)
-8E0B (jiao3,jia3,jue2)
-8E0C (chou2)
-8E0D (xiao4)
-8E0E (none0)
-8E0F (ta4,ta1)
-8E10 (jian4)
-8E11 (qi2)
-8E12 (wo1)
-8E13 (wei3)
-8E14 (chuo1)
-8E15 (jie2)
-8E16 (ji2)
-8E17 (nie1)
-8E18 (ju2)
-8E19 (ju1)
-8E1A (lun2)
-8E1B (lu4)
-8E1C (leng4)
-8E1D (huai2)
-8E1E (ju4)
-8E1F (chi2)
-8E20 (wan4)
-8E21 (quan2)
-8E22 (ti1)
-8E23 (bo2)
-8E24 (zu2)
-8E25 (qie4)
-8E26 (qi1)
-8E27 (cu4)
-8E28 (zong1)
-8E29 (cai3)
-8E2A (zong1)
-8E2B (pan2)
-8E2C (zhi4)
-8E2D (zheng1)
-8E2E (dian3,die1)
-8E2F (zhi2)
-8E30 (yu2)
-8E31 (duo2)
-8E32 (dun4)
-8E33 (chun3)
-8E34 (yong3)
-8E35 (zhong3)
-8E36 (di4)
-8E37 (zha3)
-8E38 (chen3)
-8E39 (chuai4)
-8E3A (jian4)
-8E3B (gua1)
-8E3C (tang2)
-8E3D (ju3)
-8E3E (fu2)
-8E3F (zu2)
-8E40 (die2)
-8E41 (pian2)
-8E42 (rou2)
-8E43 (nuo4)
-8E44 (ti2)
-8E45 (cha3)
-8E46 (tui3)
-8E47 (jian3)
-8E48 (dao3)
-8E49 (cuo1)
-8E4A (xi1,qi1)
-8E4B (ta4)
-8E4C (qiang1,qiang4)
-8E4D (zhan3)
-8E4E (dian1)
-8E4F (ti2)
-8E50 (ji2)
-8E51 (nie4)
-8E52 (pan2)
-8E53 (liu4)
-8E54 (zhan4)
-8E55 (bi4)
-8E56 (chong1)
-8E57 (lu4)
-8E58 (liao2)
-8E59 (cu4)
-8E5A (tang1)
-8E5B (dai4)
-8E5C (su4)
-8E5D (xi3)
-8E5E (kui3)
-8E5F (ji1)
-8E60 (zhi2)
-8E61 (qiang1)
-8E62 (di2,zhi2)
-8E63 (man2,pan2)
-8E64 (zong1)
-8E65 (lian2)
-8E66 (beng4)
-8E67 (zao1)
-8E68 (nian3)
-8E69 (bie2)
-8E6A (tui2)
-8E6B (ju2)
-8E6C (deng4,deng1)
-8E6D (ceng4)
-8E6E (xian1)
-8E6F (fan2)
-8E70 (chu2)
-8E71 (zhong1)
-8E72 (dun1,cun2)
-8E73 (bo1)
-8E74 (cu4)
-8E75 (zu2)
-8E76 (jue2,jue3)
-8E77 (jue2)
-8E78 (lin2)
-8E79 (ta4)
-8E7A (qiao1)
-8E7B (qiao1)
-8E7C (pu3,pu2)
-8E7D (liao1)
-8E7E (dun1)
-8E7F (cuan1)
-8E80 (kuang4)
-8E81 (zao4)
-8E82 (ta4)
-8E83 (bi4)
-8E84 (bi4)
-8E85 (zhu2)
-8E86 (ju4)
-8E87 (chu2)
-8E88 (qiao4)
-8E89 (dun3)
-8E8A (chou2)
-8E8B (ji1,ji4)
-8E8C (wu3)
-8E8D (yue4)
-8E8E (nian3)
-8E8F (lin4)
-8E90 (lie4)
-8E91 (zhi2)
-8E92 (li4)
-8E93 (zhi4)
-8E94 (chan2)
-8E95 (chu2)
-8E96 (duan4)
-8E97 (wei4)
-8E98 (long2)
-8E99 (lin4)
-8E9A (xian1)
-8E9B (wei4)
-8E9C (zuan1)
-8E9D (lan2)
-8E9E (xie4)
-8E9F (rang2)
-8EA0 (xie4)
-8EA1 (nie4)
-8EA2 (ta4)
-8EA3 (qu2)
-8EA4 (jie4)
-8EA5 (cuan1)
-8EA6 (zuan1)
-8EA7 (xi3)
-8EA8 (kui2)
-8EA9 (jue2)
-8EAA (lin4)
-8EAB (shen1,juan1)
-8EAC (gong1)
-8EAD (dan1)
-8EAE (none0)
-8EAF (qu1)
-8EB0 (ti3)
-8EB1 (duo3)
-8EB2 (duo3)
-8EB3 (gong1)
-8EB4 (lang2)
-8EB5 (none0)
-8EB6 (luo3)
-8EB7 (ai3)
-8EB8 (ji1)
-8EB9 (ju2)
-8EBA (tang3)
-8EBB (none0)
-8EBC (none0)
-8EBD (yan3)
-8EBE (none0)
-8EBF (kang1)
-8EC0 (qu1)
-8EC1 (lou2)
-8EC2 (lao4)
-8EC3 (duo3)
-8EC4 (zhi2)
-8EC5 (none0)
-8EC6 (ti3)
-8EC7 (dao4)
-8EC8 (none0)
-8EC9 (yu4)
-8ECA (che1,ju1)
-8ECB (ya4,zha2,ga2)
-8ECC (gui3)
-8ECD (jun1)
-8ECE (wei4)
-8ECF (yue4)
-8ED0 (xin4)
-8ED1 (di4)
-8ED2 (xuan1)
-8ED3 (fan4)
-8ED4 (ren4)
-8ED5 (shan1)
-8ED6 (qiang2)
-8ED7 (shu1)
-8ED8 (tun2)
-8ED9 (chen2)
-8EDA (dai4)
-8EDB (e4)
-8EDC (na4)
-8EDD (qi2)
-8EDE (mao2)
-8EDF (ruan3)
-8EE0 (ren4)
-8EE1 (qian2)
-8EE2 (zhuan3,zhuai3,zhuan4)
-8EE3 (hong1)
-8EE4 (hu1)
-8EE5 (qu2)
-8EE6 (huang4)
-8EE7 (di3)
-8EE8 (ling2)
-8EE9 (dai4)
-8EEA (ao1)
-8EEB (zhen3)
-8EEC (fan4)
-8EED (kuang1)
-8EEE (ang3)
-8EEF (peng1)
-8EF0 (bei4)
-8EF1 (gu1)
-8EF2 (gu1)
-8EF3 (pao2)
-8EF4 (zhu4)
-8EF5 (rong3,fu3)
-8EF6 (e4)
-8EF7 (ba2)
-8EF8 (zhou2,zhou4,zhu2)
-8EF9 (zhi3)
-8EFA (yao2)
-8EFB (ke1,ke3)
-8EFC (yi4)
-8EFD (qing1)
-8EFE (shi4)
-8EFF (ping2)
-8F00 (er2)
-8F01 (qiong2)
-8F02 (ju2)
-8F03 (jiao4,jiao3)
-8F04 (guang1)
-8F05 (lu4)
-8F06 (kai3)
-8F07 (quan2)
-8F08 (zhou1)
-8F09 (zai4,zai3)
-8F0A (zhi4)
-8F0B (ju1)
-8F0C (liang4)
-8F0D (yu4)
-8F0E (shao1)
-8F0F (you2)
-8F10 (huan3)
-8F11 (yun3)
-8F12 (zhe2)
-8F13 (wan3)
-8F14 (fu3)
-8F15 (qing1)
-8F16 (zhou1)
-8F17 (ni2)
-8F18 (ling2)
-8F19 (zhe2)
-8F1A (zhan4)
-8F1B (liang4)
-8F1C (zi1)
-8F1D (hui1)
-8F1E (wang3)
-8F1F (chuo4)
-8F20 (guo3)
-8F21 (kan3)
-8F22 (yi3)
-8F23 (peng2)
-8F24 (qian4)
-8F25 (gun3)
-8F26 (nian3)
-8F27 (ping2)
-8F28 (guan3)
-8F29 (bei4)
-8F2A (lun2)
-8F2B (pai2)
-8F2C (liang2)
-8F2D (ruan3)
-8F2E (rou2)
-8F2F (ji2)
-8F30 (yang2)
-8F31 (xian2)
-8F32 (chuan2)
-8F33 (cou4)
-8F34 (chun1)
-8F35 (ge2)
-8F36 (you2)
-8F37 (hong1)
-8F38 (shu1)
-8F39 (fu4)
-8F3A (zi1)
-8F3B (fu2)
-8F3C (wen1)
-8F3D (ben4)
-8F3E (zhan3)
-8F3F (yu2)
-8F40 (wen1)
-8F41 (tao1)
-8F42 (gu3,gu1)
-8F43 (zhen1)
-8F44 (xia2)
-8F45 (yuan2)
-8F46 (lu4)
-8F47 (jiu1)
-8F48 (chao2)
-8F49 (zhuan3,zhuai3,zhuan4)
-8F4A (wei4)
-8F4B (hun2)
-8F4C (none0)
-8F4D (che4,zhe2)
-8F4E (jiao4)
-8F4F (zhan4)
-8F50 (pu2)
-8F51 (lao3)
-8F52 (fen2)
-8F53 (fan1)
-8F54 (lin2)
-8F55 (ge2)
-8F56 (se4)
-8F57 (kan3)
-8F58 (huan4)
-8F59 (yi3)
-8F5A (ji2)
-8F5B (dui4)
-8F5C (er2)
-8F5D (yu2)
-8F5E (xian4)
-8F5F (hong1)
-8F60 (lei2)
-8F61 (pei4)
-8F62 (li4)
-8F63 (li4)
-8F64 (lu2)
-8F65 (lin2)
-8F66 (che1,ju1)
-8F67 (ya4,zha2,ga2)
-8F68 (gui3)
-8F69 (xuan1)
-8F6A (dai4)
-8F6B (ren4)
-8F6C (zhuan3,zhuan4,zhuai3)
-8F6D (e4)
-8F6E (lun2)
-8F6F (ruan3)
-8F70 (hong1)
-8F71 (gu1)
-8F72 (ke1,ke3)
-8F73 (lu2,lu5)
-8F74 (zhou2,zhou4)
-8F75 (zhi3)
-8F76 (yi4)
-8F77 (hu1)
-8F78 (zhen3)
-8F79 (li4)
-8F7A (yao2)
-8F7B (qing1)
-8F7C (shi4)
-8F7D (zai3,zai4)
-8F7E (zhi4)
-8F7F (jiao4)
-8F80 (zhou1)
-8F81 (quan2)
-8F82 (lu4)
-8F83 (jiao4)
-8F84 (zhe2)
-8F85 (fu3)
-8F86 (liang4)
-8F87 (nian3)
-8F88 (bei4)
-8F89 (hui1)
-8F8A (gun3)
-8F8B (wang3)
-8F8C (liang2)
-8F8D (chuo4)
-8F8E (zi1)
-8F8F (cou4)
-8F90 (fu2)
-8F91 (ji2,ji5)
-8F92 (wen1)
-8F93 (shu1)
-8F94 (pei4)
-8F95 (yuan2)
-8F96 (xia2)
-8F97 (zhan3)
-8F98 (lu4)
-8F99 (zhe2)
-8F9A (lin2)
-8F9B (xin1)
-8F9C (gu1)
-8F9D (ci2)
-8F9E (ci2)
-8F9F (pi4,bi4,pi1)
-8FA0 (zui4)
-8FA1 (bian4)
-8FA2 (la4)
-8FA3 (la4)
-8FA4 (ci2)
-8FA5 (xue1)
-8FA6 (ban4)
-8FA7 (bian4)
-8FA8 (bian4)
-8FA9 (bian4)
-8FAA (none0)
-8FAB (bian4)
-8FAC (ban1)
-8FAD (ci2)
-8FAE (bian4)
-8FAF (bian4)
-8FB0 (chen2)
-8FB1 (ru3,ru4)
-8FB2 (nong2)
-8FB3 (nong2)
-8FB4 (zhen3)
-8FB5 (chuo4)
-8FB6 (chuo4)
-8FB7 (none0)
-8FB8 (reng2)
-8FB9 (bian1,bian5)
-8FBA (bian1)
-8FBB (none0)
-8FBC (none0)
-8FBD (liao2)
-8FBE (da2)
-8FBF (chan1)
-8FC0 (gan1)
-8FC1 (qian1)
-8FC2 (yu1)
-8FC3 (yu1)
-8FC4 (qi4)
-8FC5 (xun4)
-8FC6 (yi3,yi2)
-8FC7 (guo4,guo1)
-8FC8 (mai4)
-8FC9 (qi2)
-8FCA (za1)
-8FCB (wang4)
-8FCC (none0)
-8FCD (zhun1)
-8FCE (ying2)
-8FCF (ti4)
-8FD0 (yun4)
-8FD1 (jin4)
-8FD2 (hang2)
-8FD3 (ya4)
-8FD4 (fan3)
-8FD5 (wu3)
-8FD6 (ta4)
-8FD7 (e2)
-8FD8 (hai2,huan2)
-8FD9 (zhei4,zhe4)
-8FDA (none0)
-8FDB (jin4)
-8FDC (yuan3)
-8FDD (wei2)
-8FDE (lian2)
-8FDF (chi2)
-8FE0 (che4)
-8FE1 (ni4)
-8FE2 (tiao2)
-8FE3 (zhi4)
-8FE4 (yi3,yi2)
-8FE5 (jiong3)
-8FE6 (jia1)
-8FE7 (chen2)
-8FE8 (dai4)
-8FE9 (er3)
-8FEA (di2)
-8FEB (po4,pai3)
-8FEC (wang3)
-8FED (die2)
-8FEE (ze2)
-8FEF (tao2)
-8FF0 (shu4)
-8FF1 (tuo2)
-8FF2 (none0)
-8FF3 (jing4)
-8FF4 (hui2)
-8FF5 (tong2)
-8FF6 (you4)
-8FF7 (mi2)
-8FF8 (beng4)
-8FF9 (ji1,ji4)
-8FFA (nai3)
-8FFB (yi2)
-8FFC (jie2)
-8FFD (zhui1)
-8FFE (lie4)
-8FFF (xun4)
-9000 (tui4)
-9001 (song4)
-9002 (shi4,kuo4)
-9003 (tao2)
-9004 (pang2)
-9005 (hou4)
-9006 (ni4)
-9007 (dun4)
-9008 (jiong3)
-9009 (xuan3)
-900A (xun4)
-900B (bu1)
-900C (you2)
-900D (xiao1)
-900E (qiu2)
-900F (tou4)
-9010 (zhu2)
-9011 (qiu2)
-9012 (di4)
-9013 (di4)
-9014 (tu2)
-9015 (jing4)
-9016 (ti4)
-9017 (dou4)
-9018 (yi3)
-9019 (zhe4,zhei4)
-901A (tong1,tong4)
-901B (guang4)
-901C (wu4)
-901D (shi4)
-901E (cheng3)
-901F (su4)
-9020 (zao4)
-9021 (qun1)
-9022 (feng2)
-9023 (lian2)
-9024 (suo4)
-9025 (hui2)
-9026 (li3)
-9027 (none0)
-9028 (zui4)
-9029 (ben1)
-902A (cuo4)
-902B (jue2)
-902C (beng4)
-902D (huan4)
-902E (dai4,dai3)
-902F (lu4)
-9030 (you2)
-9031 (zhou1)
-9032 (jin4)
-9033 (yu4)
-9034 (chuo4)
-9035 (kui2)
-9036 (wei1)
-9037 (ti4)
-9038 (yi4)
-9039 (da2)
-903A (yuan3)
-903B (luo2)
-903C (bi1)
-903D (nuo4)
-903E (yu2)
-903F (dang4)
-9040 (sui2)
-9041 (dun4)
-9042 (sui4,sui2)
-9043 (yan3)
-9044 (chuan2)
-9045 (chi2)
-9046 (ti2)
-9047 (yu4)
-9048 (shi2)
-9049 (zhen1)
-904A (you2)
-904B (yun4)
-904C (e4)
-904D (bian4,pian4)
-904E (guo4,guo1)
-904F (e4)
-9050 (xia2)
-9051 (huang2)
-9052 (qiu2)
-9053 (dao4)
-9054 (da2)
-9055 (wei2)
-9056 (none0)
-9057 (yi2,wei4)
-9058 (gou4)
-9059 (yao2)
-905A (chu4)
-905B (liu2,liu4)
-905C (xun4)
-905D (ta4)
-905E (di4)
-905F (chi2)
-9060 (yuan3,yuan4)
-9061 (su4)
-9062 (ta4,ta1)
-9063 (qian3)
-9064 (none0)
-9065 (yao2)
-9066 (guan4)
-9067 (zhang1)
-9068 (ao2)
-9069 (shi4,kuo4)
-906A (ce4)
-906B (su4)
-906C (su4)
-906D (zao1)
-906E (zhe1,zhe5)
-906F (dun4)
-9070 (zhi4)
-9071 (lou2)
-9072 (chi2)
-9073 (cuo1)
-9074 (lin2)
-9075 (zun1)
-9076 (rao4)
-9077 (qian1)
-9078 (xuan3)
-9079 (yu4)
-907A (yi2,wei4)
-907B (wu4)
-907C (liao2)
-907D (ju4)
-907E (shi4)
-907F (bi4)
-9080 (yao1)
-9081 (mai4)
-9082 (xie4)
-9083 (sui4)
-9084 (huan2,hai2,xuan2)
-9085 (zhan1)
-9086 (deng4)
-9087 (er3)
-9088 (miao3)
-9089 (bian1)
-908A (bian1)
-908B (la1)
-908C (li2)
-908D (yuan2)
-908E (you2)
-908F (luo2)
-9090 (li3)
-9091 (yi4)
-9092 (ting2)
-9093 (deng4)
-9094 (qi3)
-9095 (yong1)
-9096 (shan1)
-9097 (han2)
-9098 (yu2)
-9099 (mang2)
-909A (ru2)
-909B (qiong2)
-909C (none0)
-909D (kuang4)
-909E (fu1)
-909F (kang4)
-90A0 (bin1)
-90A1 (fang1)
-90A2 (xing2)
-90A3 (nei4,na4,na1,na3)
-90A4 (none0)
-90A5 (shen3)
-90A6 (bang1)
-90A7 (yuan2)
-90A8 (cun1)
-90A9 (huo3)
-90AA (xie2,ye2)
-90AB (bang1)
-90AC (wu1)
-90AD (ju4)
-90AE (you2)
-90AF (han2)
-90B0 (tai2)
-90B1 (qiu1)
-90B2 (bi4)
-90B3 (pi1)
-90B4 (bing3)
-90B5 (shao4)
-90B6 (bei4)
-90B7 (wa3)
-90B8 (di3)
-90B9 (zou1)
-90BA (ye4)
-90BB (lin2)
-90BC (kuang1)
-90BD (gui1)
-90BE (zhu1)
-90BF (shi1)
-90C0 (ku1)
-90C1 (yu4)
-90C2 (gai1)
-90C3 (he2)
-90C4 (qie4)
-90C5 (zhi4)
-90C6 (ji2)
-90C7 (xun2,huan2)
-90C8 (hou4)
-90C9 (xing2)
-90CA (jiao1)
-90CB (xi1)
-90CC (gui1)
-90CD (nuo2)
-90CE (lang2,lang4)
-90CF (jia2)
-90D0 (kuai4)
-90D1 (zheng4)
-90D2 (lang2,lang4)
-90D3 (yun4)
-90D4 (yan2)
-90D5 (cheng2)
-90D6 (dou1)
-90D7 (xi1)
-90D8 (lu:3)
-90D9 (fu3)
-90DA (wu2)
-90DB (fu2)
-90DC (gao4)
-90DD (hao3)
-90DE (lang2)
-90DF (jia2)
-90E0 (geng3)
-90E1 (jun4)
-90E2 (ying3)
-90E3 (bo2)
-90E4 (xi4)
-90E5 (bei4)
-90E6 (li4)
-90E7 (yun2)
-90E8 (bu4)
-90E9 (xiao2)
-90EA (qi1)
-90EB (pi2)
-90EC (qing1)
-90ED (guo1)
-90EE (none0)
-90EF (tan2)
-90F0 (zou1)
-90F1 (ping2)
-90F2 (lai2)
-90F3 (ni2)
-90F4 (chen1)
-90F5 (you2)
-90F6 (bu4)
-90F7 (xiang1)
-90F8 (dan1)
-90F9 (ju2)
-90FA (yong1)
-90FB (qiao1)
-90FC (yi1)
-90FD (dou1,du1)
-90FE (yan3)
-90FF (mei2)
-9100 (ruo4)
-9101 (bei4)
-9102 (e4)
-9103 (yu2)
-9104 (juan4)
-9105 (yu3)
-9106 (yun4)
-9107 (hou4)
-9108 (kui2)
-9109 (xiang1)
-910A (xiang1)
-910B (sou1)
-910C (tang2)
-910D (ming2)
-910E (xi4)
-910F (ru4)
-9110 (chu4)
-9111 (zi1)
-9112 (zou1)
-9113 (ju2)
-9114 (wu1)
-9115 (xiang1)
-9116 (yun2)
-9117 (hao4)
-9118 (yong1)
-9119 (bi3,bi4)
-911A (mao4)
-911B (chao2)
-911C (fu1)
-911D (liao3)
-911E (yin2)
-911F (zhuan1)
-9120 (hu4)
-9121 (qiao1)
-9122 (yan1)
-9123 (zhang1)
-9124 (fan4)
-9125 (wu3)
-9126 (xu3)
-9127 (deng4)
-9128 (bi4)
-9129 (xin2)
-912A (bi4)
-912B (ceng2)
-912C (wei2)
-912D (zheng4)
-912E (mao4)
-912F (shan4)
-9130 (lin2)
-9131 (po2)
-9132 (dan1)
-9133 (meng2)
-9134 (ye4)
-9135 (cao1)
-9136 (kuai4)
-9137 (feng1)
-9138 (meng2)
-9139 (zou1)
-913A (kuang4)
-913B (lian3)
-913C (zan4)
-913D (chan2)
-913E (you1)
-913F (qi2)
-9140 (yan1)
-9141 (chan2)
-9142 (cuo2)
-9143 (ling2)
-9144 (huan1)
-9145 (xi1)
-9146 (feng1)
-9147 (zan4)
-9148 (li4)
-9149 (you3)
-914A (ding3,ding1)
-914B (qiu2)
-914C (zhuo2)
-914D (pei4)
-914E (zhou4)
-914F (yi2,yi4,yi3)
-9150 (gan1)
-9151 (yu3)
-9152 (jiu3)
-9153 (yan3)
-9154 (zui4)
-9155 (mao2)
-9156 (dan1,zhen4)
-9157 (xu4)
-9158 (tou2)
-9159 (zhen1)
-915A (fen1)
-915B (none0)
-915C (none0)
-915D (yun4)
-915E (tai4)
-915F (tian1)
-9160 (qia3)
-9161 (tuo2)
-9162 (zuo4,cu4)
-9163 (han1)
-9164 (gu1)
-9165 (su1)
-9166 (fa1,po1)
-9167 (chou2)
-9168 (dai4)
-9169 (ming3,ming2)
-916A (lao4,luo4)
-916B (chuo4)
-916C (chou2)
-916D (you4)
-916E (tong2)
-916F (zhi3)
-9170 (xian1)
-9171 (jiang4)
-9172 (cheng2)
-9173 (yin4)
-9174 (tu2)
-9175 (jiao4,xiao4)
-9176 (mei2)
-9177 (ku4)
-9178 (suan1)
-9179 (lei4)
-917A (pu2)
-917B (zui4)
-917C (hai3)
-917D (yan4)
-917E (shi1,shai1)
-917F (niang4,nian4,niang2)
-9180 (wei2)
-9181 (lu4)
-9182 (lan3)
-9183 (yan1)
-9184 (tao2)
-9185 (pei1)
-9186 (zhan3)
-9187 (chun2)
-9188 (tan2)
-9189 (zui4)
-918A (chuo4)
-918B (cu4)
-918C (kun1)
-918D (ti2)
-918E (xian2)
-918F (du1)
-9190 (hu2)
-9191 (xu3)
-9192 (xing3)
-9193 (tan3)
-9194 (qiu2)
-9195 (chun2)
-9196 (yun4)
-9197 (fa1,po1)
-9198 (ke1)
-9199 (sou1)
-919A (mi2)
-919B (quan2)
-919C (chou3)
-919D (cuo2)
-919E (yun4)
-919F (yong4)
-91A0 (ang4)
-91A1 (zha4)
-91A2 (hai3)
-91A3 (tang2)
-91A4 (jiang4)
-91A5 (piao3)
-91A6 (lao2)
-91A7 (yu4)
-91A8 (li2)
-91A9 (zao2)
-91AA (lao2)
-91AB (yi1)
-91AC (jiang4)
-91AD (bu2)
-91AE (jiao4)
-91AF (xi1,xi4)
-91B0 (tan2)
-91B1 (fa1,po4)
-91B2 (nong2)
-91B3 (yi4)
-91B4 (li3)
-91B5 (ju4)
-91B6 (yan4)
-91B7 (yi4)
-91B8 (niang4)
-91B9 (ru2)
-91BA (xun1)
-91BB (chou2)
-91BC (yan4)
-91BD (ling2)
-91BE (mi2)
-91BF (mi2)
-91C0 (niang4)
-91C1 (xin4)
-91C2 (jiao4)
-91C3 (shi1)
-91C4 (mi2)
-91C5 (yan4)
-91C6 (bian4)
-91C7 (cai3,cai4)
-91C8 (shi4)
-91C9 (you4)
-91CA (shi4)
-91CB (shi4)
-91CC (li3,li5)
-91CD (zhong4,chong2)
-91CE (ye3)
-91CF (liang4,liang2,liang5)
-91D0 (li2,xi1)
-91D1 (jin1)
-91D2 (jin1)
-91D3 (ga2)
-91D4 (yi3)
-91D5 (liao3,liao4)
-91D6 (dao1)
-91D7 (zhao1)
-91D8 (ding1,ding4)
-91D9 (li4)
-91DA (qiu2)
-91DB (he2)
-91DC (fu3)
-91DD (zhen1)
-91DE (zhi2)
-91DF (ba1)
-91E0 (luan4)
-91E1 (fu3)
-91E2 (nai3)
-91E3 (diao4)
-91E4 (shan4,shan1)
-91E5 (qiao3)
-91E6 (kou4)
-91E7 (chuan4)
-91E8 (zi3)
-91E9 (fan2)
-91EA (yu2)
-91EB (hua2)
-91EC (han4)
-91ED (gong1,gang1)
-91EE (qi2)
-91EF (mang2)
-91F0 (jian4)
-91F1 (di4)
-91F2 (si4)
-91F3 (xi4)
-91F4 (yi4)
-91F5 (chai1)
-91F6 (ta1,tuo2)
-91F7 (tu3)
-91F8 (xi4)
-91F9 (nu:3)
-91FA (qian1)
-91FB (none0)
-91FC (jian4)
-91FD (pi1)
-91FE (ye2)
-91FF (yin2)
-9200 (ba3,pa2)
-9201 (fang1)
-9202 (chen2)
-9203 (jian1)
-9204 (tou3)
-9205 (yue4)
-9206 (yan2)
-9207 (fu1)
-9208 (bu4)
-9209 (na4)
-920A (xin1)
-920B (e2)
-920C (jue2)
-920D (dun4)
-920E (gou1)
-920F (yin3)
-9210 (qian2)
-9211 (ban3)
-9212 (ji2)
-9213 (ren2)
-9214 (chao1)
-9215 (niu3)
-9216 (fen1)
-9217 (yun3)
-9218 (yi2)
-9219 (qin2)
-921A (pi2)
-921B (guo1)
-921C (hong2)
-921D (yin2)
-921E (jun1)
-921F (shi1)
-9220 (yi4)
-9221 (zhong1)
-9222 (nie1)
-9223 (gai4)
-9224 (ri4)
-9225 (huo2,huo3)
-9226 (tai4)
-9227 (kang4)
-9228 (none0)
-9229 (lu2)
-922A (none0)
-922B (none0)
-922C (duo2)
-922D (zi1)
-922E (ni2)
-922F (tu2)
-9230 (shi4)
-9231 (min2)
-9232 (gu1)
-9233 (ke1)
-9234 (ling2)
-9235 (bing3)
-9236 (yi2)
-9237 (gu1,gu3)
-9238 (ba2)
-9239 (pi1,pi2)
-923A (yu4)
-923B (si4)
-923C (zuo2)
-923D (bu4,bu1)
-923E (you2)
-923F (dian4,tian2)
-9240 (jia3)
-9241 (zhen1)
-9242 (shi3)
-9243 (shi4)
-9244 (tie3)
-9245 (ju4)
-9246 (zhan1)
-9247 (ta1,tuo2)
-9248 (she2,tuo2,ta1)
-9249 (xuan4)
-924A (zhao1)
-924B (bao4)
-924C (he2)
-924D (bi4)
-924E (sheng1)
-924F (chu2)
-9250 (shi2)
-9251 (bo2)
-9252 (zhu4)
-9253 (chi4)
-9254 (za1)
-9255 (po3)
-9256 (tong2)
-9257 (qian2)
-9258 (fu2)
-9259 (zhai3)
-925A (liu3,mao3)
-925B (qian1,yan2)
-925C (fu2)
-925D (li4)
-925E (yue4)
-925F (pi1)
-9260 (yang1)
-9261 (ban4)
-9262 (bo1)
-9263 (jie2)
-9264 (gou1)
-9265 (shu4)
-9266 (zheng1)
-9267 (mu3)
-9268 (ni2)
-9269 (xi3)
-926A (di4)
-926B (jia1)
-926C (mu4)
-926D (tan3)
-926E (shen1)
-926F (yi3)
-9270 (si1)
-9271 (kuang4)
-9272 (ka1)
-9273 (bei3)
-9274 (jian4)
-9275 (tong2)
-9276 (xing2)
-9277 (hong2)
-9278 (jiao3,jia3)
-9279 (chi3)
-927A (er3)
-927B (ge4)
-927C (bing3)
-927D (shi4)
-927E (mou2)
-927F (jia2,ha1)
-9280 (yin2)
-9281 (jun1)
-9282 (zhou1)
-9283 (chong4)
-9284 (shang4)
-9285 (tong2)
-9286 (mo4)
-9287 (lei4)
-9288 (ji1)
-9289 (yu4)
-928A (xu4)
-928B (ren2)
-928C (cun4)
-928D (zhi4)
-928E (qiong2)
-928F (shan4)
-9290 (chi4)
-9291 (xian3,xi3)
-9292 (xing2)
-9293 (quan2)
-9294 (pi1)
-9295 (yi2)
-9296 (zhu1)
-9297 (hou2)
-9298 (ming2)
-9299 (kua3)
-929A (yao2,diao4,tiao2)
-929B (xian1)
-929C (xian2)
-929D (xiu1)
-929E (jun1)
-929F (cha1)
-92A0 (lao3)
-92A1 (ji2)
-92A2 (yong3)
-92A3 (ru2)
-92A4 (mi3)
-92A5 (yi1)
-92A6 (yin1)
-92A7 (guang1)
-92A8 (an1,an3)
-92A9 (diu1)
-92AA (you3)
-92AB (se4)
-92AC (kao4)
-92AD (qian2)
-92AE (luan2)
-92AF (none0)
-92B0 (ai1)
-92B1 (diao4)
-92B2 (han4)
-92B3 (rui4)
-92B4 (shi4)
-92B5 (keng1)
-92B6 (qiu2)
-92B7 (xiao1)
-92B8 (zhe2)
-92B9 (xiu4)
-92BA (zang4)
-92BB (ti4,ti1)
-92BC (cuo4)
-92BD (gua1)
-92BE (gong3)
-92BF (zhong1)
-92C0 (dou4)
-92C1 (lu:3)
-92C2 (mei2)
-92C3 (lang2)
-92C4 (wan3)
-92C5 (xin1)
-92C6 (yun2)
-92C7 (bei4)
-92C8 (wu4)
-92C9 (su4)
-92CA (yu4)
-92CB (chan2)
-92CC (ting3,ding4)
-92CD (bo2)
-92CE (han4)
-92CF (jia2)
-92D0 (hong2)
-92D1 (cuan1)
-92D2 (feng1)
-92D3 (chan1)
-92D4 (wan3)
-92D5 (zhi4)
-92D6 (si1)
-92D7 (xuan1)
-92D8 (wu2)
-92D9 (wu2)
-92DA (tiao2)
-92DB (gong3)
-92DC (zhuo2)
-92DD (lu:e4)
-92DE (xing2)
-92DF (qin3)
-92E0 (shen4)
-92E1 (han2)
-92E2 (none0)
-92E3 (ye2)
-92E4 (chu2)
-92E5 (zeng4)
-92E6 (ju2,ju1)
-92E7 (xian4)
-92E8 (e2)
-92E9 (mang2)
-92EA (pu1,pu4)
-92EB (li2)
-92EC (shi4)
-92ED (rui4)
-92EE (cheng2)
-92EF (gao4)
-92F0 (li3)
-92F1 (te4)
-92F2 (none0)
-92F3 (zhu4)
-92F4 (none0)
-92F5 (tu1)
-92F6 (liu3)
-92F7 (zui4)
-92F8 (ju4,ju1)
-92F9 (chang3)
-92FA (yuan1)
-92FB (jian4)
-92FC (gang1,gang4)
-92FD (diao4)
-92FE (tao2)
-92FF (chang2)
-9300 (lun2)
-9301 (guo3)
-9302 (ling2)
-9303 (bei1)
-9304 (lu4)
-9305 (li2)
-9306 (qing1,qiang1)
-9307 (pei2)
-9308 (juan3)
-9309 (min2)
-930A (zui4)
-930B (peng2)
-930C (an4)
-930D (pi2)
-930E (xian4)
-930F (ya4)
-9310 (zhui1)
-9311 (lei4)
-9312 (a1,e1)
-9313 (kong1)
-9314 (ta4)
-9315 (kun1)
-9316 (du3)
-9317 (wei4)
-9318 (chui2)
-9319 (zi1)
-931A (zheng1,zheng4)
-931B (ben1)
-931C (nie4)
-931D (cong2)
-931E (chun2)
-931F (tan2)
-9320 (ding4)
-9321 (qi2)
-9322 (qian2)
-9323 (zhuo2)
-9324 (qi2)
-9325 (yu4)
-9326 (jin3)
-9327 (guan3)
-9328 (mao2)
-9329 (chang1)
-932A (dian3)
-932B (xi2,xi1)
-932C (lian4)
-932D (tao2)
-932E (gu4)
-932F (cuo4,cu4)
-9330 (shu4)
-9331 (zhen1)
-9332 (lu4)
-9333 (meng3)
-9334 (lu4)
-9335 (hua1)
-9336 (biao3)
-9337 (ga2)
-9338 (lai2)
-9339 (ken3)
-933A (zhui4)
-933B (none0)
-933C (nai4)
-933D (wan3)
-933E (zan4)
-933F (none0)
-9340 (de2)
-9341 (xian1)
-9342 (none0)
-9343 (huo1)
-9344 (liang4)
-9345 (none0)
-9346 (men2)
-9347 (kai3)
-9348 (ying1)
-9349 (di1)
-934A (lian4)
-934B (guo1)
-934C (xian3)
-934D (du4)
-934E (tu2)
-934F (wei2)
-9350 (cong1)
-9351 (fu4)
-9352 (rou2)
-9353 (ji2)
-9354 (e4)
-9355 (rou3)
-9356 (chen3)
-9357 (ti2)
-9358 (zha2)
-9359 (hong4)
-935A (yang2)
-935B (duan4)
-935C (xia1)
-935D (yu2)
-935E (keng1)
-935F (xing1)
-9360 (huang2)
-9361 (wei3)
-9362 (fu4)
-9363 (zhao1)
-9364 (cha2,cha1)
-9365 (qie4)
-9366 (she2)
-9367 (hong1)
-9368 (kui2)
-9369 (nuo4)
-936A (mou2)
-936B (qiao1)
-936C (qiao1)
-936D (hou2)
-936E (zhen1)
-936F (huo1)
-9370 (huan2)
-9371 (ye4)
-9372 (min2)
-9373 (jian4)
-9374 (duan3)
-9375 (jian4)
-9376 (si1)
-9377 (kui1)
-9378 (hu2)
-9379 (xuan1)
-937A (zang1,zhe3)
-937B (jie2)
-937C (zhen1)
-937D (bian1)
-937E (zhong1)
-937F (zi1)
-9380 (xiu1)
-9381 (ye2)
-9382 (mei3)
-9383 (pai4)
-9384 (ai1)
-9385 (jie4)
-9386 (none0)
-9387 (mei2)
-9388 (cha1)
-9389 (ta4)
-938A (bang4)
-938B (xia2)
-938C (lian2)
-938D (suo3)
-938E (xi4)
-938F (liu2)
-9390 (zu2)
-9391 (ye4)
-9392 (nou4)
-9393 (weng1)
-9394 (rong2)
-9395 (tang2)
-9396 (suo3)
-9397 (qiang1)
-9398 (ge2)
-9399 (shuo4)
-939A (chui2)
-939B (bo2)
-939C (pan2)
-939D (ta3)
-939E (bi4)
-939F (sang3)
-93A0 (gang1)
-93A1 (zi1)
-93A2 (wu1)
-93A3 (ying4,ying2)
-93A4 (huang3)
-93A5 (tiao2)
-93A6 (liu2,liu4)
-93A7 (kai3)
-93A8 (sun3)
-93A9 (sha1)
-93AA (sou1)
-93AB (wan4)
-93AC (hao4,gao3)
-93AD (zhen4)
-93AE (zhen4)
-93AF (luo3)
-93B0 (yi4)
-93B1 (yuan2)
-93B2 (tang3)
-93B3 (nie4)
-93B4 (xi2)
-93B5 (jia1)
-93B6 (ge1)
-93B7 (ma3)
-93B8 (juan1)
-93B9 (rong2)
-93BA (none0)
-93BB (suo3)
-93BC (none0)
-93BD (none0)
-93BE (none0)
-93BF (na2)
-93C0 (lu3)
-93C1 (suo3)
-93C2 (kou1)
-93C3 (zu2,cu4)
-93C4 (tuan2)
-93C5 (xiu1)
-93C6 (guan4)
-93C7 (xuan4)
-93C8 (lian4)
-93C9 (shou4)
-93CA (ao4)
-93CB (man3)
-93CC (mo4)
-93CD (luo2)
-93CE (bi4)
-93CF (wei4)
-93D0 (liu2)
-93D1 (di2,di1)
-93D2 (qiao1)
-93D3 (huo1)
-93D4 (yin2)
-93D5 (lu4)
-93D6 (ao2)
-93D7 (keng1)
-93D8 (qiang1)
-93D9 (cui1)
-93DA (qi4)
-93DB (chang2)
-93DC (tang1,tang2)
-93DD (man4)
-93DE (yong1)
-93DF (chan3)
-93E0 (feng1)
-93E1 (jing4)
-93E2 (biao1)
-93E3 (shu4)
-93E4 (lou4)
-93E5 (xiu4)
-93E6 (cong1)
-93E7 (long2)
-93E8 (zan4)
-93E9 (jian4)
-93EA (cao2)
-93EB (li2)
-93EC (xia4)
-93ED (xi1)
-93EE (kang1)
-93EF (none0)
-93F0 (beng4)
-93F1 (none0)
-93F2 (none0)
-93F3 (zheng1)
-93F4 (lu4)
-93F5 (hua2)
-93F6 (ji2)
-93F7 (pu2)
-93F8 (hui4)
-93F9 (qiang1,qiang3)
-93FA (po1)
-93FB (lin2)
-93FC (suo3)
-93FD (xiu4)
-93FE (san3)
-93FF (cheng1)
-9400 (kui4)
-9401 (san3)
-9402 (liu4,liu2)
-9403 (nao2)
-9404 (huang2)
-9405 (pie3)
-9406 (sui4)
-9407 (fan2)
-9408 (qiao2)
-9409 (chuan1)
-940A (yang2)
-940B (tang4,tang1)
-940C (xiang4)
-940D (jue2)
-940E (jiao1)
-940F (zun1)
-9410 (liao2,liao4)
-9411 (jie2)
-9412 (lao2)
-9413 (dui4,dun1)
-9414 (tan2,chan2,xin2)
-9415 (zan1)
-9416 (ji1)
-9417 (jian3,jian4)
-9418 (zhong1)
-9419 (deng1,deng4)
-941A (lou4,lue2)
-941B (ying4)
-941C (dui4)
-941D (jue2)
-941E (nou4)
-941F (ti4)
-9420 (pu3)
-9421 (tie3)
-9422 (none0)
-9423 (none0)
-9424 (ding3)
-9425 (shan4)
-9426 (kai1)
-9427 (jian3,jian4)
-9428 (fei4)
-9429 (sui4)
-942A (lu3)
-942B (juan1)
-942C (hui4)
-942D (yu4)
-942E (lian2)
-942F (zhuo2)
-9430 (qiao1)
-9431 (qian1)
-9432 (zhuo2)
-9433 (lei2)
-9434 (bi4)
-9435 (tie3)
-9436 (huan2)
-9437 (ye4)
-9438 (duo2)
-9439 (guo3)
-943A (dang1,cheng1)
-943B (ju4)
-943C (fen2)
-943D (da2)
-943E (bei4)
-943F (yi4)
-9440 (ai4)
-9441 (dang1,zheng1)
-9442 (xun4)
-9443 (diao4,yao2)
-9444 (zhu4)
-9445 (heng2)
-9446 (zhui4)
-9447 (ji1)
-9448 (nie1)
-9449 (ta4)
-944A (huo4)
-944B (qing4)
-944C (bin1)
-944D (ying1)
-944E (kui4)
-944F (ning2)
-9450 (xu1)
-9451 (jian4)
-9452 (jian4)
-9453 (qiang1)
-9454 (cha3)
-9455 (zhi4)
-9456 (mie4)
-9457 (li2)
-9458 (lei2)
-9459 (ji1)
-945A (zuan4,zuan1)
-945B (kuang4)
-945C (shang3)
-945D (peng2)
-945E (la4)
-945F (du2)
-9460 (shuo4)
-9461 (chuo4)
-9462 (lu:4)
-9463 (biao1)
-9464 (bao4)
-9465 (lu3)
-9466 (none0)
-9467 (none0)
-9468 (long2)
-9469 (e4)
-946A (lu2)
-946B (xin1)
-946C (jian4)
-946D (lan4,lan2)
-946E (bo2)
-946F (jian1)
-9470 (yao4,yue4)
-9471 (chan2)
-9472 (xiang1)
-9473 (jian4)
-9474 (xi4)
-9475 (guan4)
-9476 (cang2)
-9477 (nie4)
-9478 (lei3)
-9479 (cuan1)
-947A (qu2)
-947B (pan4)
-947C (luo2)
-947D (zuan4,zuan1,zuan3)
-947E (luan2)
-947F (zao2,zuo4)
-9480 (nie4)
-9481 (jue2)
-9482 (tang3)
-9483 (shu3)
-9484 (lan2)
-9485 (jin1)
-9486 (ga2)
-9487 (yi3)
-9488 (zhen1)
-9489 (ding1,ding4)
-948A (zhao1)
-948B (po1)
-948C (liao3,liao4)
-948D (tu3)
-948E (qian1)
-948F (chuan4)
-9490 (shan4,shan1)
-9491 (sa4)
-9492 (fan2)
-9493 (diao4)
-9494 (men2)
-9495 (nu:3)
-9496 (yang2)
-9497 (chai1)
-9498 (xing2)
-9499 (gai4)
-949A (bu4)
-949B (tai4)
-949C (ju4)
-949D (dun4)
-949E (chao1)
-949F (zhong1)
-94A0 (na4)
-94A1 (bei4)
-94A2 (gang1,gang4)
-94A3 (ban3)
-94A4 (qian2)
-94A5 (yao4,yue4)
-94A6 (qin1)
-94A7 (jun1)
-94A8 (wu1)
-94A9 (gou1)
-94AA (kang4)
-94AB (fang1)
-94AC (huo3)
-94AD (tou3)
-94AE (niu3)
-94AF (ba3,pa2)
-94B0 (yu4)
-94B1 (qian2)
-94B2 (zheng1,zheng4)
-94B3 (qian2)
-94B4 (gu3)
-94B5 (bo1)
-94B6 (ke1)
-94B7 (po3)
-94B8 (bu1)
-94B9 (bo2)
-94BA (yue4)
-94BB (zuan4,zuan1)
-94BC (mu4)
-94BD (tan3)
-94BE (jia3)
-94BF (dian4,tian2)
-94C0 (you2)
-94C1 (tie3)
-94C2 (bo2)
-94C3 (ling2)
-94C4 (shuo4)
-94C5 (qian1,yan2)
-94C6 (mao3)
-94C7 (bao4)
-94C8 (shi4)
-94C9 (xuan4)
-94CA (tuo2,she2,ta1)
-94CB (bi4)
-94CC (ni2)
-94CD (pi2,pi1)
-94CE (duo2)
-94CF (xing2)
-94D0 (kao4)
-94D1 (lao3)
-94D2 (er3)
-94D3 (mang2)
-94D4 (ya4)
-94D5 (you3)
-94D6 (cheng2)
-94D7 (jia2)
-94D8 (ye2)
-94D9 (nao2)
-94DA (zhi4)
-94DB (dang1,cheng1)
-94DC (tong2)
-94DD (lu:3)
-94DE (diao4)
-94DF (yin1)
-94E0 (kai3)
-94E1 (zha2)
-94E2 (zhu1)
-94E3 (xian3,xi3)
-94E4 (ting3,ding4)
-94E5 (diu1)
-94E6 (xian1)
-94E7 (hua2)
-94E8 (quan2)
-94E9 (sha1)
-94EA (ha1)
-94EB (yao2,diao4,tiao2)
-94EC (ge4)
-94ED (ming2)
-94EE (zheng1,zheng4)
-94EF (se4)
-94F0 (jiao3,jia3)
-94F1 (yi1)
-94F2 (chan3)
-94F3 (chong4)
-94F4 (tang1)
-94F5 (an3)
-94F6 (yin2)
-94F7 (ru2)
-94F8 (zhu4)
-94F9 (lao2)
-94FA (pu1,pu4)
-94FB (wu2)
-94FC (lai2)
-94FD (te4)
-94FE (lian4)
-94FF (keng1)
-9500 (xiao1)
-9501 (suo3)
-9502 (li3)
-9503 (zeng4)
-9504 (chu2)
-9505 (guo1)
-9506 (gao4)
-9507 (e2)
-9508 (xiu4)
-9509 (cuo4)
-950A (lu:e4)
-950B (feng1)
-950C (xin1)
-950D (liu3)
-950E (kai1)
-950F (jian3,jian4)
-9510 (rui4)
-9511 (ti1)
-9512 (lang2)
-9513 (qin3)
-9514 (ju1,ju2)
-9515 (a1)
-9516 (qing1,qiang1)
-9517 (zhe3,zang1)
-9518 (nuo4)
-9519 (cuo4)
-951A (mao2)
-951B (ben1)
-951C (qi2)
-951D (de2)
-951E (ke4)
-951F (kun1)
-9520 (chang1)
-9521 (xi1)
-9522 (gu4)
-9523 (luo2)
-9524 (chui2)
-9525 (zhui1)
-9526 (jin3)
-9527 (zhi4)
-9528 (xian1)
-9529 (juan3)
-952A (huo4,huo1)
-952B (pei2)
-952C (tan2)
-952D (ding4)
-952E (jian4)
-952F (ju4,ju1)
-9530 (meng3)
-9531 (zi1)
-9532 (qie4)
-9533 (ying1)
-9534 (kai3)
-9535 (qiang1)
-9536 (si1)
-9537 (e4)
-9538 (cha1)
-9539 (qiao1)
-953A (zhong1)
-953B (duan4)
-953C (sou1)
-953D (huang2)
-953E (huan2)
-953F (ai1)
-9540 (du4)
-9541 (mei3)
-9542 (lou4)
-9543 (zi1)
-9544 (fei4)
-9545 (mei2)
-9546 (mo4)
-9547 (zhen4)
-9548 (bo2)
-9549 (ge2)
-954A (nie4)
-954B (tang3)
-954C (juan1)
-954D (nie4)
-954E (na2)
-954F (liu2,liu4)
-9550 (hao4,gao3)
-9551 (bang4)
-9552 (yi4)
-9553 (jia1)
-9554 (bin1)
-9555 (rong2)
-9556 (biao1)
-9557 (tang1,tang2)
-9558 (man4)
-9559 (luo2)
-955A (beng4)
-955B (yong1)
-955C (jing4)
-955D (di2,di1)
-955E (zu2)
-955F (xuan4)
-9560 (liu2)
-9561 (chan2,xin2,tan2)
-9562 (jue2)
-9563 (liao4)
-9564 (pu2)
-9565 (lu3)
-9566 (dun1,dui4)
-9567 (lan2)
-9568 (pu3)
-9569 (cuan1)
-956A (qiang1,qiang3)
-956B (deng4)
-956C (huo4)
-956D (lei2)
-956E (huan2)
-956F (zhuo2)
-9570 (lian2)
-9571 (yi4)
-9572 (cha3)
-9573 (biao1)
-9574 (la4)
-9575 (chan2)
-9576 (xiang1)
-9577 (chang2,zhang3)
-9578 (chang2,zhang3)
-9579 (jiu3)
-957A (ao3)
-957B (die2)
-957C (qu1)
-957D (liao2)
-957E (mi2)
-957F (zhang3,chang2)
-9580 (men2)
-9581 (ma4)
-9582 (shuan1)
-9583 (shan3)
-9584 (huo2)
-9585 (men2)
-9586 (yan4,yan2)
-9587 (bi4)
-9588 (han4)
-9589 (bi4)
-958A (none0)
-958B (kai1)
-958C (kang4,kang1)
-958D (beng1)
-958E (hong2)
-958F (run4)
-9590 (san4)
-9591 (xian2)
-9592 (xian2)
-9593 (jian1,jian4)
-9594 (min3)
-9595 (xia1)
-9596 (min3)
-9597 (dou4)
-9598 (zha2)
-9599 (nao4)
-959A (none0)
-959B (peng1)
-959C (ke3)
-959D (ling2)
-959E (bian4)
-959F (bi4)
-95A0 (run4)
-95A1 (he2)
-95A2 (guan1)
-95A3 (ge2)
-95A4 (he2,ge2)
-95A5 (fa2)
-95A6 (chu4)
-95A7 (hong4,hong1,hong3)
-95A8 (gui1)
-95A9 (min3)
-95AA (none0)
-95AB (kun3)
-95AC (lang3,lang2,lang4)
-95AD (lu:2)
-95AE (ting2)
-95AF (sha4)
-95B0 (yan2)
-95B1 (yue4)
-95B2 (yue4)
-95B3 (chan3)
-95B4 (qu4)
-95B5 (lin4)
-95B6 (chang1)
-95B7 (shai4)
-95B8 (kun3)
-95B9 (yan1)
-95BA (min2,wen2)
-95BB (yan2)
-95BC (e4,yan1)
-95BD (hun1)
-95BE (yu4)
-95BF (wen2)
-95C0 (xiang4)
-95C1 (none0)
-95C2 (xiang4)
-95C3 (qu4)
-95C4 (yao3)
-95C5 (wen2)
-95C6 (ban3)
-95C7 (an4)
-95C8 (wei2)
-95C9 (yin1)
-95CA (kuo4)
-95CB (que4)
-95CC (lan2)
-95CD (du1,she2)
-95CE (none0)
-95CF (none0)
-95D0 (tian2)
-95D1 (nie4)
-95D2 (da2,ta4)
-95D3 (kai3)
-95D4 (he2)
-95D5 (que4,que1)
-95D6 (chuang3,chuang4)
-95D7 (guan1)
-95D8 (dou4,dou3)
-95D9 (qi3)
-95DA (kui1)
-95DB (tang2)
-95DC (guan1)
-95DD (piao2)
-95DE (kan4,han3,kan3)
-95DF (xi1)
-95E0 (hui4)
-95E1 (chan3)
-95E2 (pi4,bi4,pi1)
-95E3 (dang4)
-95E4 (huan2)
-95E5 (ta4)
-95E6 (wen2)
-95E7 (none0)
-95E8 (men2)
-95E9 (shuan1)
-95EA (shan3)
-95EB (yan2)
-95EC (han4)
-95ED (bi4)
-95EE (wen4)
-95EF (chuang3)
-95F0 (run4)
-95F1 (wei2)
-95F2 (xian2)
-95F3 (hong2)
-95F4 (jian1,jian4)
-95F5 (min3)
-95F6 (kang1,kang4)
-95F7 (men4,men1)
-95F8 (zha2)
-95F9 (nao4)
-95FA (gui1)
-95FB (wen2)
-95FC (ta4)
-95FD (min3)
-95FE (lu:2)
-95FF (kai3)
-9600 (fa2)
-9601 (ge2)
-9602 (he2)
-9603 (kun3)
-9604 (jiu1)
-9605 (yue4)
-9606 (lang2,lang4)
-9607 (du1,she2)
-9608 (yu4)
-9609 (yan1)
-960A (chang1)
-960B (xi4)
-960C (wen2)
-960D (hun1)
-960E (yan2)
-960F (yan1,e4)
-9610 (chan3)
-9611 (lan2)
-9612 (qu4)
-9613 (hui4)
-9614 (kuo4)
-9615 (que4)
-9616 (he2)
-9617 (tian2)
-9618 (da2,ta4)
-9619 (que1,que4)
-961A (kan4,han3,kan3)
-961B (huan2)
-961C (fu4)
-961D (fu4,yi4)
-961E (le4)
-961F (dui4)
-9620 (xin4,shen1)
-9621 (qian1)
-9622 (wu4)
-9623 (yi4)
-9624 (tuo2)
-9625 (yin1)
-9626 (yang2)
-9627 (dou3)
-9628 (e4)
-9629 (sheng1)
-962A (ban3)
-962B (pei2)
-962C (keng1)
-962D (yun3)
-962E (ruan3)
-962F (zhi3)
-9630 (pi2)
-9631 (jing3)
-9632 (fang2)
-9633 (yang2)
-9634 (yin1)
-9635 (zhen4)
-9636 (jie1)
-9637 (cheng1)
-9638 (e4)
-9639 (qu1)
-963A (di3)
-963B (zu3)
-963C (zuo4)
-963D (dian4,yan2)
-963E (ling3)
-963F (a1,e1,a5,a2,a4)
-9640 (tuo2)
-9641 (tuo2)
-9642 (po1,bei1,pi2)
-9643 (bing3)
-9644 (fu4)
-9645 (ji4)
-9646 (lu4,liu4)
-9647 (long3)
-9648 (chen2)
-9649 (xing2)
-964A (duo4)
-964B (lou4)
-964C (mo4)
-964D (jiang4,xiang2)
-964E (shu1)
-964F (duo4)
-9650 (xian4)
-9651 (er2)
-9652 (gui3)
-9653 (wu1)
-9654 (gai1)
-9655 (shan3)
-9656 (jun4)
-9657 (qiao4)
-9658 (xing2)
-9659 (chun2)
-965A (fu4)
-965B (bi4)
-965C (shan3)
-965D (shan3,xia2)
-965E (sheng1)
-965F (zhi4)
-9660 (pu1)
-9661 (dou3)
-9662 (yuan4)
-9663 (zhen4)
-9664 (chu2)
-9665 (xian4)
-9666 (zhi4)
-9667 (nie4)
-9668 (yun3)
-9669 (xian3)
-966A (pei2)
-966B (pei2)
-966C (zou1)
-966D (yi1,yi3)
-966E (dui4)
-966F (lun2)
-9670 (yin1)
-9671 (ju2)
-9672 (chui2)
-9673 (chen2)
-9674 (pi2)
-9675 (ling2)
-9676 (tao2,yao2)
-9677 (xian4)
-9678 (lu4,liu4)
-9679 (none0)
-967A (xian3)
-967B (yin1)
-967C (zhu3)
-967D (yang2)
-967E (reng2)
-967F (shan3)
-9680 (chong2)
-9681 (yan4)
-9682 (yin1)
-9683 (yu2)
-9684 (ti2)
-9685 (yu2)
-9686 (long2,long1)
-9687 (wei1)
-9688 (wei1)
-9689 (nie4)
-968A (dui4)
-968B (sui2)
-968C (an3)
-968D (huang2)
-968E (jie1)
-968F (sui2)
-9690 (yin3)
-9691 (gai1)
-9692 (yan3)
-9693 (hui1)
-9694 (ge2)
-9695 (yun3)
-9696 (wu4)
-9697 (wei3,kui2)
-9698 (ai4)
-9699 (xi4)
-969A (tang2)
-969B (ji4)
-969C (zhang4)
-969D (dao3)
-969E (ao2)
-969F (xi4)
-96A0 (yin3)
-96A1 (sa4)
-96A2 (rao4)
-96A3 (lin2)
-96A4 (tui2)
-96A5 (deng4)
-96A6 (pi2)
-96A7 (sui4)
-96A8 (sui2)
-96A9 (yu4)
-96AA (xian3)
-96AB (fen1)
-96AC (ni3)
-96AD (er2)
-96AE (ji1)
-96AF (dao3)
-96B0 (xi2)
-96B1 (yin3,yin4)
-96B2 (zhi4)
-96B3 (hui1)
-96B4 (long3)
-96B5 (xi1)
-96B6 (li4)
-96B7 (li4)
-96B8 (li4)
-96B9 (zhui1,cui1)
-96BA (he4)
-96BB (zhi1)
-96BC (sun3,zhun3)
-96BD (juan4,jun4)
-96BE (nan2,nan4)
-96BF (yi4)
-96C0 (que4,qiao1,qiao3)
-96C1 (yan4)
-96C2 (qin2)
-96C3 (ya3)
-96C4 (xiong2)
-96C5 (ya3,ya1)
-96C6 (ji2)
-96C7 (gu4)
-96C8 (huan2)
-96C9 (zhi4)
-96CA (gou4)
-96CB (jun4,juan4)
-96CC (ci2,ci1)
-96CD (yong1)
-96CE (ju1)
-96CF (chu2)
-96D0 (hu1)
-96D1 (za2)
-96D2 (luo4)
-96D3 (yu2)
-96D4 (chou2)
-96D5 (diao1)
-96D6 (sui1)
-96D7 (han4)
-96D8 (huo4)
-96D9 (shuang1)
-96DA (guan4)
-96DB (chu2)
-96DC (za2)
-96DD (yong1)
-96DE (ji1)
-96DF (sui2)
-96E0 (chou2)
-96E1 (liu4)
-96E2 (li2)
-96E3 (nan2,nan4)
-96E4 (xue2)
-96E5 (za2)
-96E6 (ji2)
-96E7 (ji2)
-96E8 (yu3,yu4)
-96E9 (yu2)
-96EA (xue3,xue4)
-96EB (na3)
-96EC (fou3)
-96ED (se4)
-96EE (mu4)
-96EF (wen2)
-96F0 (fen1)
-96F1 (pang2)
-96F2 (yun2)
-96F3 (li4)
-96F4 (li4)
-96F5 (yang1)
-96F6 (ling2)
-96F7 (lei2)
-96F8 (an2)
-96F9 (bao2)
-96FA (meng2)
-96FB (dian4)
-96FC (dang4)
-96FD (hang2,yu2)
-96FE (wu4)
-96FF (zhao4)
-9700 (xu1)
-9701 (ji4)
-9702 (mu4)
-9703 (chen2)
-9704 (xiao1)
-9705 (zha2)
-9706 (ting2)
-9707 (zhen4)
-9708 (pei4)
-9709 (mei2)
-970A (ling2)
-970B (qi1)
-970C (chou1)
-970D (huo4)
-970E (sha4)
-970F (fei1)
-9710 (weng1)
-9711 (zhan1)
-9712 (ying1)
-9713 (ni2)
-9714 (chou4)
-9715 (tun2)
-9716 (lin2)
-9717 (none0)
-9718 (dong4)
-9719 (ying1,ji1)
-971A (wu4)
-971B (ling2)
-971C (shuang1)
-971D (ling2)
-971E (xia2)
-971F (hong2)
-9720 (yin1)
-9721 (mai4)
-9722 (mo4)
-9723 (yun3)
-9724 (liu4)
-9725 (meng4)
-9726 (bin1)
-9727 (wu4)
-9728 (wei4)
-9729 (kuo4)
-972A (yin2)
-972B (xi2)
-972C (yi4)
-972D (ai3)
-972E (dan4)
-972F (deng4)
-9730 (xian4,san3)
-9731 (yu4)
-9732 (lu4,lou4)
-9733 (long2,long1)
-9734 (dai4)
-9735 (ji2)
-9736 (pang2)
-9737 (yang2)
-9738 (ba4)
-9739 (pi1)
-973A (wei2)
-973B (none0)
-973C (xi3)
-973D (ji4)
-973E (mai2)
-973F (meng4)
-9740 (meng2)
-9741 (lei2)
-9742 (li4)
-9743 (huo4,sui3)
-9744 (ai3)
-9745 (fei4)
-9746 (dai4)
-9747 (long2)
-9748 (ling2)
-9749 (ai4)
-974A (feng1)
-974B (li4)
-974C (bao3)
-974D (none0)
-974E (he4)
-974F (he4)
-9750 (bing4)
-9751 (qing1)
-9752 (qing1)
-9753 (jing4,liang4)
-9754 (qi2)
-9755 (zhen1)
-9756 (jing4)
-9757 (cheng1)
-9758 (qing4)
-9759 (jing4)
-975A (jing4,liang4)
-975B (dian4)
-975C (jing4)
-975D (tian1)
-975E (fei1)
-975F (fei1)
-9760 (kao4)
-9761 (mi3,mi2)
-9762 (mian4)
-9763 (mian4)
-9764 (pao4)
-9765 (ye4)
-9766 (tian3,mian3)
-9767 (hui4)
-9768 (ye4)
-9769 (ge2,ji2,ji3)
-976A (ding1)
-976B (ren4)
-976C (jian1)
-976D (ren4)
-976E (di2)
-976F (du4)
-9770 (wu4)
-9771 (ren4)
-9772 (qin2)
-9773 (jin4)
-9774 (xue1)
-9775 (niu3)
-9776 (ba3)
-9777 (yin3)
-9778 (sa3)
-9779 (ren4)
-977A (mo4)
-977B (zu3)
-977C (da2)
-977D (ban4)
-977E (yi4)
-977F (yao4)
-9780 (tao2)
-9781 (bei4,tuo2)
-9782 (jia2)
-9783 (hong2)
-9784 (pao2)
-9785 (yang1,yang4,yang3)
-9786 (mo4)
-9787 (yin1)
-9788 (jia2)
-9789 (tao2)
-978A (ji2)
-978B (xie2)
-978C (an1)
-978D (an1)
-978E (hen2)
-978F (gong3)
-9790 (gong3)
-9791 (da2)
-9792 (qiao2)
-9793 (ting1)
-9794 (man2,wan3)
-9795 (ying4)
-9796 (sui1)
-9797 (tiao2)
-9798 (qiao4,shao1)
-9799 (xuan4)
-979A (kong4)
-979B (beng3)
-979C (ta4)
-979D (zhang3)
-979E (bing3)
-979F (kuo4)
-97A0 (ju1,ju2)
-97A1 (la5)
-97A2 (xie4)
-97A3 (rou2)
-97A4 (bang1)
-97A5 (yi4,eng1)
-97A6 (qiu1)
-97A7 (qiu1)
-97A8 (he2)
-97A9 (xiao4)
-97AA (mu4)
-97AB (ju1,ju2)
-97AC (jian1)
-97AD (bian1)
-97AE (di1)
-97AF (jian1)
-97B0 (none0)
-97B1 (tao1)
-97B2 (gou1)
-97B3 (ta4)
-97B4 (bei4)
-97B5 (xie2)
-97B6 (pan2)
-97B7 (ge2)
-97B8 (bi4)
-97B9 (kuo4,kui1)
-97BA (tang1)
-97BB (lou2)
-97BC (gui4)
-97BD (qiao2)
-97BE (xue1)
-97BF (ji1)
-97C0 (jian1)
-97C1 (jiang1)
-97C2 (chan4)
-97C3 (da2)
-97C4 (huo4)
-97C5 (xian3)
-97C6 (qian1)
-97C7 (du2)
-97C8 (wa4)
-97C9 (jian1)
-97CA (lan2)
-97CB (wei2)
-97CC (ren4)
-97CD (fu2)
-97CE (mei4)
-97CF (juan4)
-97D0 (ge2)
-97D1 (wei3)
-97D2 (qiao4)
-97D3 (han2)
-97D4 (chang4)
-97D5 (none0)
-97D6 (rou2)
-97D7 (xun4)
-97D8 (she4)
-97D9 (wei3)
-97DA (ge2)
-97DB (bei4)
-97DC (tao1)
-97DD (gou4)
-97DE (yun4)
-97DF (gao1)
-97E0 (bi4)
-97E1 (wei3)
-97E2 (hui4)
-97E3 (shu3)
-97E4 (wa4)
-97E5 (du2)
-97E6 (wei2)
-97E7 (ren4)
-97E8 (fu2)
-97E9 (han2)
-97EA (wei3)
-97EB (yun4)
-97EC (tao1)
-97ED (jiu3)
-97EE (jiu3)
-97EF (xian1)
-97F0 (xie4)
-97F1 (xian1)
-97F2 (ji1)
-97F3 (yin1)
-97F4 (za2)
-97F5 (yun4)
-97F6 (shao2)
-97F7 (luo4)
-97F8 (peng2)
-97F9 (huang2)
-97FA (ying1)
-97FB (yun4)
-97FC (peng2)
-97FD (yin1,an1)
-97FE (yin1)
-97FF (xiang3)
-9800 (hu4)
-9801 (ye4)
-9802 (ding3)
-9803 (qing3,qing1)
-9804 (pan4)
-9805 (xiang4)
-9806 (shun4)
-9807 (han1)
-9808 (xu1)
-9809 (yi2)
-980A (xu1)
-980B (gu4)
-980C (song4)
-980D (kui3)
-980E (qi2)
-980F (hang2)
-9810 (yu4)
-9811 (wan2)
-9812 (ban1)
-9813 (dun4,du2)
-9814 (di2)
-9815 (dan1)
-9816 (pan4)
-9817 (po3)
-9818 (ling3)
-9819 (cheng1)
-981A (jing3,geng3)
-981B (lei3)
-981C (he2,han4)
-981D (qiao1)
-981E (e4)
-981F (e2)
-9820 (wei3)
-9821 (jie2,xie2)
-9822 (gua1)
-9823 (shen3)
-9824 (yi2)
-9825 (yi2)
-9826 (ke1,ke2)
-9827 (dui1)
-9828 (pian1)
-9829 (ping1)
-982A (lei4)
-982B (fu3)
-982C (jia2)
-982D (tou2,tou5)
-982E (hui4)
-982F (kui2)
-9830 (jia2)
-9831 (le4)
-9832 (ting3)
-9833 (cheng1)
-9834 (ying3)
-9835 (jun1)
-9836 (hu2)
-9837 (han4)
-9838 (jing3,geng3)
-9839 (tui2)
-983A (tui2)
-983B (pin2)
-983C (lai4)
-983D (tui2)
-983E (zi1)
-983F (zi1)
-9840 (chui2)
-9841 (ding4)
-9842 (lai4)
-9843 (yan2)
-9844 (han4)
-9845 (qian1)
-9846 (ke1)
-9847 (cui4)
-9848 (jiong3)
-9849 (qin3)
-984A (yi2)
-984B (sai1)
-984C (ti2)
-984D (e2)
-984E (e4)
-984F (yan2)
-9850 (hun2)
-9851 (kan3)
-9852 (yong2)
-9853 (zhuan1)
-9854 (yan2)
-9855 (xian3)
-9856 (xin4)
-9857 (yi3)
-9858 (yuan4)
-9859 (sang3)
-985A (dian1)
-985B (dian1)
-985C (jiang3)
-985D (ku1)
-985E (lei4)
-985F (liao2)
-9860 (piao4)
-9861 (yi4)
-9862 (man2,man1)
-9863 (qi1)
-9864 (yao2)
-9865 (hao4)
-9866 (qiao2)
-9867 (gu4)
-9868 (xun4)
-9869 (qian1)
-986A (hui1)
-986B (zhan4,chan4)
-986C (ru2)
-986D (hong1)
-986E (bin1)
-986F (xian3)
-9870 (pin2)
-9871 (lu2)
-9872 (lan3)
-9873 (nie4)
-9874 (quan2)
-9875 (ye4)
-9876 (ding3)
-9877 (qing3)
-9878 (han1)
-9879 (xiang4)
-987A (shun4)
-987B (xu1)
-987C (xu1)
-987D (wan2)
-987E (gu4)
-987F (dun4,du2)
-9880 (qi2)
-9881 (ban1)
-9882 (song4)
-9883 (hang2)
-9884 (yu4)
-9885 (lu2)
-9886 (ling3)
-9887 (po1)
-9888 (jing3,geng3)
-9889 (jie2,xie2)
-988A (jia2)
-988B (ting3)
-988C (he2,ge2)
-988D (ying3)
-988E (jiong3)
-988F (ke1,ke2)
-9890 (yi2)
-9891 (pin2)
-9892 (hui4)
-9893 (tui2)
-9894 (han4)
-9895 (ying3)
-9896 (ying3)
-9897 (ke1)
-9898 (ti2)
-9899 (yong2)
-989A (e4)
-989B (zhuan1)
-989C (yan2)
-989D (e2)
-989E (nie4)
-989F (man1)
-98A0 (dian1)
-98A1 (sang3)
-98A2 (hao4)
-98A3 (lei4)
-98A4 (zhan4,chan4)
-98A5 (ru2)
-98A6 (pin2)
-98A7 (quan2)
-98A8 (feng1)
-98A9 (biao1)
-98AA (none0)
-98AB (fu2)
-98AC (xia1)
-98AD (zhan3)
-98AE (biao1)
-98AF (sa4)
-98B0 (fa1)
-98B1 (tai2)
-98B2 (lie4)
-98B3 (gua1)
-98B4 (xuan4)
-98B5 (shao4)
-98B6 (ju4)
-98B7 (biao1)
-98B8 (si1)
-98B9 (wei3)
-98BA (yang2)
-98BB (yao2)
-98BC (sou1)
-98BD (kai3)
-98BE (sao1)
-98BF (fan2)
-98C0 (liu2)
-98C1 (xi2)
-98C2 (liao2)
-98C3 (piao1)
-98C4 (piao1)
-98C5 (liu2)
-98C6 (biao1)
-98C7 (biao1)
-98C8 (biao1)
-98C9 (liao2)
-98CA (none0)
-98CB (se4)
-98CC (feng1)
-98CD (biao1)
-98CE (feng1)
-98CF (yang2)
-98D0 (zhan3)
-98D1 (biao1)
-98D2 (sa4)
-98D3 (ju4)
-98D4 (si1)
-98D5 (sou1)
-98D6 (yao2)
-98D7 (liu2)
-98D8 (piao1)
-98D9 (biao1)
-98DA (biao1)
-98DB (fei1)
-98DC (fan1)
-98DD (fei1)
-98DE (fei1)
-98DF (shi2,si4,yi4)
-98E0 (shi2,si4)
-98E1 (can1)
-98E2 (ji1)
-98E3 (ding4)
-98E4 (si4)
-98E5 (tuo2)
-98E6 (jian1)
-98E7 (sun1)
-98E8 (xiang3)
-98E9 (tun5,tun2)
-98EA (ren4)
-98EB (yu4)
-98EC (juan4)
-98ED (chi4)
-98EE (yin3,yin4)
-98EF (fan4)
-98F0 (fan4)
-98F1 (sun1)
-98F2 (yin3,yin4)
-98F3 (zhu4)
-98F4 (yi2)
-98F5 (zhai3)
-98F6 (bi4)
-98F7 (jie3)
-98F8 (tao1)
-98F9 (liu3)
-98FA (ci2)
-98FB (tie4)
-98FC (si4)
-98FD (bao3)
-98FE (shi4)
-98FF (duo4)
-9900 (hai4)
-9901 (ren4)
-9902 (tian3)
-9903 (jiao3,jia3)
-9904 (jia2)
-9905 (bing3)
-9906 (yao2)
-9907 (tong2)
-9908 (ci2)
-9909 (xiang3)
-990A (yang3,yang4)
-990B (yang3)
-990C (er3)
-990D (yan4)
-990E (le5)
-990F (yi1)
-9910 (can1)
-9911 (bo1)
-9912 (nei3)
-9913 (e4)
-9914 (bu1)
-9915 (jun4)
-9916 (dou4)
-9917 (su4)
-9918 (yu2)
-9919 (shi4)
-991A (yao2)
-991B (hun2)
-991C (guo3)
-991D (shi4)
-991E (jian4)
-991F (zhui4)
-9920 (bing3)
-9921 (xian4)
-9922 (bu4)
-9923 (ye4)
-9924 (tan2)
-9925 (fei3)
-9926 (zhang1)
-9927 (wei4)
-9928 (guan3)
-9929 (e4)
-992A (nuan3)
-992B (hun2)
-992C (hu2,hu1,hu4)
-992D (huang2)
-992E (tie4)
-992F (hui4)
-9930 (jian1)
-9931 (hou2)
-9932 (he2)
-9933 (xing2,tang2)
-9934 (fen1)
-9935 (wei4)
-9936 (gu3)
-9937 (cha1)
-9938 (song4)
-9939 (tang2,xing2)
-993A (bo2)
-993B (gao1)
-993C (xi4)
-993D (kui4)
-993E (liu4,liu2)
-993F (sou1)
-9940 (tao2)
-9941 (ye4)
-9942 (yun2)
-9943 (mo2)
-9944 (tang2)
-9945 (man2)
-9946 (bi4)
-9947 (yu4)
-9948 (xiu1)
-9949 (jin3)
-994A (san3)
-994B (kui4)
-994C (zhuan4)
-994D (shan4)
-994E (chi4)
-994F (dan4)
-9950 (yi4)
-9951 (ji1)
-9952 (rao2)
-9953 (cheng1)
-9954 (yong1)
-9955 (tao1)
-9956 (hui4)
-9957 (xiang3)
-9958 (zhan1)
-9959 (fen1)
-995A (hai4)
-995B (meng2)
-995C (yan4)
-995D (mo2)
-995E (chan2)
-995F (xiang3)
-9960 (luo2)
-9961 (zuan4,zan4)
-9962 (nang3,nang2)
-9963 (shi2,si4)
-9964 (ding4)
-9965 (ji1)
-9966 (tuo1)
-9967 (xing2,tang2)
-9968 (tun5,tun2)
-9969 (xi4)
-996A (ren4)
-996B (yu4)
-996C (chi4)
-996D (fan4)
-996E (yin3,yin4)
-996F (jian4)
-9970 (shi4)
-9971 (bao3)
-9972 (si4)
-9973 (duo4)
-9974 (yi2)
-9975 (er3)
-9976 (rao2)
-9977 (xiang3)
-9978 (he2)
-9979 (le5)
-997A (jiao3,jia3)
-997B (xi1)
-997C (bing3)
-997D (bo1)
-997E (dou4)
-997F (e4)
-9980 (yu2)
-9981 (nei3)
-9982 (jun4)
-9983 (guo3)
-9984 (hun2)
-9985 (xian4)
-9986 (guan3)
-9987 (cha1)
-9988 (kui4)
-9989 (gu3)
-998A (sou1)
-998B (chan2)
-998C (ye4)
-998D (mo2)
-998E (bo2)
-998F (liu4,liu2)
-9990 (xiu1)
-9991 (jin3)
-9992 (man2)
-9993 (san3)
-9994 (zhuan4)
-9995 (nang3,nang2)
-9996 (shou3)
-9997 (kui2)
-9998 (guo2)
-9999 (xiang1)
-999A (fen2)
-999B (ba2)
-999C (ni3)
-999D (bi4)
-999E (bo2)
-999F (tu2)
-99A0 (han1)
-99A1 (fei1)
-99A2 (jian1)
-99A3 (yan3)
-99A4 (ai3)
-99A5 (fu4)
-99A6 (xian1)
-99A7 (wen1)
-99A8 (xin1,xing1)
-99A9 (fen2)
-99AA (bin1)
-99AB (xing1)
-99AC (ma3)
-99AD (yu4)
-99AE (feng2,ping2)
-99AF (han4)
-99B0 (di4)
-99B1 (tuo2,duo4)
-99B2 (tuo1)
-99B3 (chi2)
-99B4 (xun4,xun2)
-99B5 (zhu4)
-99B6 (zhi1)
-99B7 (pei4)
-99B8 (xin4)
-99B9 (ri4)
-99BA (sa4)
-99BB (yin3)
-99BC (wen2)
-99BD (zhi2)
-99BE (dan4)
-99BF (lu:2)
-99C0 (you2)
-99C1 (bo2)
-99C2 (bao3)
-99C3 (kuai4)
-99C4 (tuo2,duo4)
-99C5 (yi4)
-99C6 (qu1)
-99C7 (wen2)
-99C8 (qu1)
-99C9 (jiong1)
-99CA (bo3)
-99CB (zhao1)
-99CC (yuan1)
-99CD (peng1)
-99CE (zhou4)
-99CF (ju4)
-99D0 (zhu4)
-99D1 (nu2)
-99D2 (ju1)
-99D3 (pi1)
-99D4 (zang3)
-99D5 (jia4)
-99D6 (ling2)
-99D7 (zhen1)
-99D8 (tai2)
-99D9 (fu4)
-99DA (yang3)
-99DB (shi3)
-99DC (bi4)
-99DD (tuo2)
-99DE (tuo2)
-99DF (si4)
-99E0 (liu2)
-99E1 (ma4)
-99E2 (pian2)
-99E3 (tao2)
-99E4 (zhi4)
-99E5 (rong2)
-99E6 (teng2)
-99E7 (dong4)
-99E8 (xun2)
-99E9 (quan2)
-99EA (shen1)
-99EB (jiong1)
-99EC (er3)
-99ED (hai4,xie4)
-99EE (bo2)
-99EF (none0)
-99F0 (yin1)
-99F1 (luo4)
-99F2 (none0)
-99F3 (dan4)
-99F4 (xie4)
-99F5 (liu2)
-99F6 (ju2)
-99F7 (song3)
-99F8 (qin1)
-99F9 (mang2)
-99FA (liang2)
-99FB (han4)
-99FC (tu2)
-99FD (xuan4)
-99FE (tui4)
-99FF (jun4)
-9A00 (e2)
-9A01 (cheng3)
-9A02 (xing1)
-9A03 (ai2)
-9A04 (lu4)
-9A05 (zhui1)
-9A06 (zhou1)
-9A07 (she4)
-9A08 (pian2)
-9A09 (kun1)
-9A0A (tao2)
-9A0B (lai2)
-9A0C (zong1)
-9A0D (ke4)
-9A0E (qi2,ji4)
-9A0F (qi2)
-9A10 (yan4)
-9A11 (fei1)
-9A12 (sao1)
-9A13 (yan4)
-9A14 (jie2,ge3)
-9A15 (yao3)
-9A16 (wu4)
-9A17 (pian4)
-9A18 (cong1)
-9A19 (pian4)
-9A1A (qian2)
-9A1B (fei1)
-9A1C (huang2)
-9A1D (jian1)
-9A1E (huo4)
-9A1F (yu4)
-9A20 (ti2)
-9A21 (quan2)
-9A22 (xia2)
-9A23 (zong1)
-9A24 (kui2)
-9A25 (rou2)
-9A26 (si1)
-9A27 (gua1)
-9A28 (tuo2,tan2)
-9A29 (kui4)
-9A2A (sou1)
-9A2B (qian1)
-9A2C (cheng2)
-9A2D (zhi4)
-9A2E (liu2)
-9A2F (pang2)
-9A30 (teng2)
-9A31 (xi1)
-9A32 (cao3)
-9A33 (du2)
-9A34 (yan4)
-9A35 (yuan2)
-9A36 (zou1)
-9A37 (sao1)
-9A38 (shan4)
-9A39 (li2)
-9A3A (zhi4)
-9A3B (shuang3)
-9A3C (lu4)
-9A3D (xi2)
-9A3E (luo2)
-9A3F (zhang1)
-9A40 (mo4)
-9A41 (ao4)
-9A42 (can1)
-9A43 (piao4,biao1)
-9A44 (cong1)
-9A45 (qu1)
-9A46 (bi4)
-9A47 (zhi4)
-9A48 (yu4)
-9A49 (xu1)
-9A4A (hua2)
-9A4B (bo1)
-9A4C (su4)
-9A4D (xiao1)
-9A4E (lin2)
-9A4F (zhan4)
-9A50 (dun1)
-9A51 (liu2)
-9A52 (tuo2)
-9A53 (zeng1)
-9A54 (tan2)
-9A55 (jiao1)
-9A56 (tie3)
-9A57 (yan4)
-9A58 (luo2)
-9A59 (zhan1)
-9A5A (jing1)
-9A5B (yi4)
-9A5C (ye4)
-9A5D (tuo4)
-9A5E (bin1)
-9A5F (zou4,zhou4)
-9A60 (yan4)
-9A61 (peng2)
-9A62 (lu:2)
-9A63 (teng2)
-9A64 (xiang1)
-9A65 (ji4)
-9A66 (shuang1)
-9A67 (ju2)
-9A68 (xi1)
-9A69 (huan1)
-9A6A (li2)
-9A6B (biao1)
-9A6C (ma3)
-9A6D (yu4)
-9A6E (tuo2,duo4)
-9A6F (xun4)
-9A70 (chi2)
-9A71 (qu1)
-9A72 (ri4)
-9A73 (bo2)
-9A74 (lu:2)
-9A75 (zang3)
-9A76 (shi3)
-9A77 (si4)
-9A78 (fu4)
-9A79 (ju1)
-9A7A (zou1)
-9A7B (zhu4)
-9A7C (tuo2)
-9A7D (nu2)
-9A7E (jia4)
-9A7F (yi4)
-9A80 (tai2,dai4)
-9A81 (xiao1)
-9A82 (ma4)
-9A83 (yin1)
-9A84 (jiao1)
-9A85 (hua2)
-9A86 (luo4)
-9A87 (hai4)
-9A88 (pian2)
-9A89 (biao1)
-9A8A (li2)
-9A8B (cheng3)
-9A8C (yan4)
-9A8D (xing1)
-9A8E (qin1)
-9A8F (jun4)
-9A90 (qi2)
-9A91 (qi2)
-9A92 (ke4)
-9A93 (zhui1)
-9A94 (zong1)
-9A95 (su4)
-9A96 (can1)
-9A97 (pian4)
-9A98 (zhi4)
-9A99 (kui2)
-9A9A (sao1)
-9A9B (wu4)
-9A9C (ao4)
-9A9D (liu2)
-9A9E (qian1)
-9A9F (shan4)
-9AA0 (piao4,biao1)
-9AA1 (luo2)
-9AA2 (cong1)
-9AA3 (zhan4,chan3)
-9AA4 (zhou4)
-9AA5 (ji4)
-9AA6 (shuang1)
-9AA7 (xiang1)
-9AA8 (gu2,gu3,gu1)
-9AA9 (wei3)
-9AAA (wei3)
-9AAB (wei3)
-9AAC (yu2)
-9AAD (gan4)
-9AAE (yi4)
-9AAF (ang1)
-9AB0 (tou2,shai3)
-9AB1 (jie4,xie4)
-9AB2 (bo2)
-9AB3 (bi4)
-9AB4 (ci1)
-9AB5 (ti3)
-9AB6 (di3)
-9AB7 (ku1)
-9AB8 (hai2)
-9AB9 (qiao1)
-9ABA (hou2)
-9ABB (kua4)
-9ABC (ge2)
-9ABD (tui3)
-9ABE (geng3)
-9ABF (pian2)
-9AC0 (bi4)
-9AC1 (ke1)
-9AC2 (qia4)
-9AC3 (yu2)
-9AC4 (sui3)
-9AC5 (lou2)
-9AC6 (bo2)
-9AC7 (xiao1)
-9AC8 (bang3)
-9AC9 (bo1)
-9ACA (cuo1)
-9ACB (kuan1)
-9ACC (bin4)
-9ACD (mo2)
-9ACE (liao2)
-9ACF (lou2)
-9AD0 (nao2)
-9AD1 (du2)
-9AD2 (zang1)
-9AD3 (sui3)
-9AD4 (ti3)
-9AD5 (bin4)
-9AD6 (kuan1)
-9AD7 (lu2)
-9AD8 (gao1)
-9AD9 (gao1)
-9ADA (qiao4)
-9ADB (kao1)
-9ADC (qiao1)
-9ADD (lao4)
-9ADE (zao4)
-9ADF (biao1,shan1)
-9AE0 (kun1)
-9AE1 (kun1)
-9AE2 (ti4)
-9AE3 (fang3)
-9AE4 (xiu1)
-9AE5 (ran2)
-9AE6 (mao2)
-9AE7 (dan4)
-9AE8 (kun1)
-9AE9 (bin4)
-9AEA (fa4)
-9AEB (tiao2)
-9AEC (pi1)
-9AED (zi1)
-9AEE (fa4,fa3)
-9AEF (ran2,ran3)
-9AF0 (ti4)
-9AF1 (pao4)
-9AF2 (pi4)
-9AF3 (mao2)
-9AF4 (fu2,fo2)
-9AF5 (er2)
-9AF6 (rong2)
-9AF7 (qu1)
-9AF8 (none0)
-9AF9 (xiu1)
-9AFA (gua4)
-9AFB (ji4)
-9AFC (peng2)
-9AFD (zhua1)
-9AFE (shao1)
-9AFF (sha1)
-9B00 (ti4)
-9B01 (li4)
-9B02 (bin4)
-9B03 (zong1)
-9B04 (ti4)
-9B05 (peng2)
-9B06 (song1)
-9B07 (zheng1)
-9B08 (quan2,qian2)
-9B09 (zong1)
-9B0A (shun4)
-9B0B (jian1)
-9B0C (duo3)
-9B0D (hu2)
-9B0E (la4)
-9B0F (jiu1)
-9B10 (qi2)
-9B11 (lian2)
-9B12 (zhen3)
-9B13 (bin4)
-9B14 (peng2)
-9B15 (mo4)
-9B16 (san1)
-9B17 (man2)
-9B18 (man2)
-9B19 (seng1)
-9B1A (xu1)
-9B1B (lie4)
-9B1C (qian1)
-9B1D (qian1)
-9B1E (nong2)
-9B1F (huan2)
-9B20 (kuai4)
-9B21 (ning2)
-9B22 (bin4)
-9B23 (lie4)
-9B24 (rang2)
-9B25 (dou4,dou3)
-9B26 (dou4,dou3)
-9B27 (nao4)
-9B28 (hong4)
-9B29 (xi4)
-9B2A (dou4,dou3)
-9B2B (kan4)
-9B2C (dou4)
-9B2D (dou4,dou3)
-9B2E (jiu1)
-9B2F (chang4)
-9B30 (yu4)
-9B31 (yu4)
-9B32 (li4,ge2)
-9B33 (juan4)
-9B34 (fu3)
-9B35 (qian2)
-9B36 (gui1)
-9B37 (zong1)
-9B38 (liu4)
-9B39 (gui1)
-9B3A (shang1)
-9B3B (yu4)
-9B3C (gui3)
-9B3D (mei4)
-9B3E (ji4)
-9B3F (qi2)
-9B40 (jie4)
-9B41 (kui2)
-9B42 (hun2)
-9B43 (ba2)
-9B44 (po4,tuo4,bo2)
-9B45 (mei4)
-9B46 (xu1)
-9B47 (yan3)
-9B48 (xiao1)
-9B49 (liang3)
-9B4A (yu4)
-9B4B (tui2)
-9B4C (qi1)
-9B4D (wang3)
-9B4E (liang3)
-9B4F (wei4)
-9B50 (jian1)
-9B51 (chi1)
-9B52 (piao1)
-9B53 (bi4)
-9B54 (mo2)
-9B55 (ji3)
-9B56 (xu1)
-9B57 (chou3)
-9B58 (yan3)
-9B59 (zhan3)
-9B5A (yu2)
-9B5B (dao1)
-9B5C (ren2)
-9B5D (ji4)
-9B5E (ba1)
-9B5F (hong1)
-9B60 (tuo1)
-9B61 (diao4)
-9B62 (ji3)
-9B63 (yu2)
-9B64 (e2)
-9B65 (que4)
-9B66 (sha1)
-9B67 (hang2)
-9B68 (tun2)
-9B69 (mo4)
-9B6A (gai4)
-9B6B (shen3)
-9B6C (fan3)
-9B6D (yuan2)
-9B6E (pi2)
-9B6F (lu3)
-9B70 (wen2)
-9B71 (hu2)
-9B72 (lu2)
-9B73 (za2)
-9B74 (fang2)
-9B75 (fen4)
-9B76 (na4)
-9B77 (you2)
-9B78 (none0)
-9B79 (none0)
-9B7A (he2,ge3)
-9B7B (xia2)
-9B7C (qu1)
-9B7D (han1)
-9B7E (pi2)
-9B7F (ling2)
-9B80 (tuo2)
-9B81 (ba4)
-9B82 (qiu2)
-9B83 (ping2)
-9B84 (fu2)
-9B85 (bi4)
-9B86 (ji4)
-9B87 (wei4)
-9B88 (ju1)
-9B89 (diao1)
-9B8A (ba4)
-9B8B (you2)
-9B8C (gun3)
-9B8D (pi2)
-9B8E (nian2)
-9B8F (xing1)
-9B90 (tai2)
-9B91 (bao4)
-9B92 (fu4)
-9B93 (zha3,zha4)
-9B94 (ju4)
-9B95 (gu1)
-9B96 (none0)
-9B97 (none0)
-9B98 (none0)
-9B99 (ta4)
-9B9A (jie2)
-9B9B (shua1)
-9B9C (hou4)
-9B9D (xiang3)
-9B9E (er2)
-9B9F (an4)
-9BA0 (wei2)
-9BA1 (tiao1)
-9BA2 (zhu1)
-9BA3 (yin4)
-9BA4 (lie4)
-9BA5 (luo4)
-9BA6 (tong2)
-9BA7 (yi2)
-9BA8 (qi2)
-9BA9 (bing4)
-9BAA (wei3)
-9BAB (jiao1)
-9BAC (pu4)
-9BAD (gui1,xie2)
-9BAE (xian1,xian3)
-9BAF (ge2)
-9BB0 (hui2)
-9BB1 (none0)
-9BB2 (none0)
-9BB3 (kao3)
-9BB4 (none0)
-9BB5 (duo2)
-9BB6 (jun1)
-9BB7 (ti2)
-9BB8 (mian3)
-9BB9 (shao1)
-9BBA (za3)
-9BBB (suo1)
-9BBC (qin1)
-9BBD (yu2)
-9BBE (nei3)
-9BBF (zhe2)
-9BC0 (gun3)
-9BC1 (geng3)
-9BC2 (none0)
-9BC3 (wu2)
-9BC4 (qiu2)
-9BC5 (ting2)
-9BC6 (fu3)
-9BC7 (huan4)
-9BC8 (chou2)
-9BC9 (li3)
-9BCA (sha1)
-9BCB (sha1)
-9BCC (gao4)
-9BCD (meng2)
-9BCE (none0)
-9BCF (none0)
-9BD0 (none0)
-9BD1 (none0)
-9BD2 (yong3)
-9BD3 (ni2)
-9BD4 (zi1)
-9BD5 (qi2)
-9BD6 (qing1,zheng1)
-9BD7 (xiang3)
-9BD8 (nei3)
-9BD9 (chun2)
-9BDA (ji4)
-9BDB (diao1)
-9BDC (qie4)
-9BDD (gu4)
-9BDE (zhou3)
-9BDF (dong1)
-9BE0 (lai2)
-9BE1 (fei1)
-9BE2 (ni2)
-9BE3 (yi4)
-9BE4 (kun1)
-9BE5 (lu4)
-9BE6 (jiu4)
-9BE7 (chang1)
-9BE8 (jing1)
-9BE9 (lun2)
-9BEA (ling2)
-9BEB (zou1)
-9BEC (li2)
-9BED (meng3)
-9BEE (zong1)
-9BEF (zhi2)
-9BF0 (nian2,nian3)
-9BF1 (none0)
-9BF2 (none0)
-9BF3 (none0)
-9BF4 (shi1)
-9BF5 (sao1)
-9BF6 (hun3)
-9BF7 (ti2)
-9BF8 (hou2)
-9BF9 (xing1)
-9BFA (ju1)
-9BFB (la4)
-9BFC (zong1)
-9BFD (ji4)
-9BFE (bian1)
-9BFF (bian1)
-9C00 (huan4)
-9C01 (quan2)
-9C02 (ji4)
-9C03 (wei1)
-9C04 (wei1)
-9C05 (yu2)
-9C06 (chun1)
-9C07 (rou2)
-9C08 (die2)
-9C09 (huang2)
-9C0A (lian4)
-9C0B (yan3)
-9C0C (qiu1)
-9C0D (qiu1)
-9C0E (jian4)
-9C0F (bi4)
-9C10 (e4)
-9C11 (yang2)
-9C12 (fu4)
-9C13 (sai1,xi3)
-9C14 (jian3)
-9C15 (ha2,xia1)
-9C16 (tuo3)
-9C17 (hu2)
-9C18 (none0)
-9C19 (ruo4)
-9C1A (none0)
-9C1B (wen1)
-9C1C (jian1)
-9C1D (hao4)
-9C1E (wu1,wu4)
-9C1F (pang2)
-9C20 (sao1)
-9C21 (liu2)
-9C22 (ma3)
-9C23 (shi2)
-9C24 (shi1)
-9C25 (guan1)
-9C26 (zi1)
-9C27 (teng2)
-9C28 (ta4,ta3)
-9C29 (yao2)
-9C2A (ge2)
-9C2B (rong2)
-9C2C (qian2)
-9C2D (qi2)
-9C2E (wen1)
-9C2F (ruo4)
-9C30 (none0)
-9C31 (lian2)
-9C32 (ao2)
-9C33 (le4)
-9C34 (hui1)
-9C35 (min3)
-9C36 (ji4)
-9C37 (tiao2)
-9C38 (qu1)
-9C39 (jian1)
-9C3A (sao1)
-9C3B (man2)
-9C3C (xi2)
-9C3D (qiu2)
-9C3E (biao4)
-9C3F (ji1)
-9C40 (ji4)
-9C41 (zhu2)
-9C42 (jiang1)
-9C43 (qiu1)
-9C44 (zhuan1)
-9C45 (yong1)
-9C46 (zhang1)
-9C47 (kang1)
-9C48 (xue3)
-9C49 (bie1)
-9C4A (jue2)
-9C4B (qu1)
-9C4C (xiang4)
-9C4D (bo1)
-9C4E (jiao1)
-9C4F (xun2)
-9C50 (su4)
-9C51 (huang2)
-9C52 (zun1,zun4)
-9C53 (shan4)
-9C54 (shan4)
-9C55 (fan1)
-9C56 (gui4)
-9C57 (lin2)
-9C58 (xun2)
-9C59 (miao2)
-9C5A (xi3)
-9C5B (none0)
-9C5C (xiang1)
-9C5D (fen4)
-9C5E (guan1)
-9C5F (hou4)
-9C60 (kuai4)
-9C61 (zei2)
-9C62 (sao1)
-9C63 (zhan1)
-9C64 (gan3)
-9C65 (gui4)
-9C66 (sheng2)
-9C67 (li3)
-9C68 (chang2)
-9C69 (none0)
-9C6A (none0)
-9C6B (ai4)
-9C6C (ru2)
-9C6D (ji4)
-9C6E (xu4)
-9C6F (huo4)
-9C70 (none0)
-9C71 (li4)
-9C72 (lie4)
-9C73 (li4)
-9C74 (mie4)
-9C75 (zhen1)
-9C76 (xiang3)
-9C77 (e4)
-9C78 (lu2)
-9C79 (guan4)
-9C7A (li2)
-9C7B (xian1)
-9C7C (yu2)
-9C7D (dao1)
-9C7E (ji3)
-9C7F (you2)
-9C80 (tun2)
-9C81 (lu3)
-9C82 (fang2)
-9C83 (ba1)
-9C84 (ke3)
-9C85 (ba4)
-9C86 (ping2)
-9C87 (nian2)
-9C88 (lu2)
-9C89 (you2)
-9C8A (zha3)
-9C8B (fu4)
-9C8C (ba4,bo2)
-9C8D (bao4)
-9C8E (hou4)
-9C8F (pi2)
-9C90 (tai2)
-9C91 (gui1,xie2)
-9C92 (jie2)
-9C93 (kao4)
-9C94 (wei3)
-9C95 (er2)
-9C96 (tong2)
-9C97 (zei2)
-9C98 (hou4)
-9C99 (kuai4)
-9C9A (ji4)
-9C9B (jiao1)
-9C9C (xian1,xian3)
-9C9D (zha3)
-9C9E (xiang3)
-9C9F (xun2)
-9CA0 (geng3)
-9CA1 (li2)
-9CA2 (lian2)
-9CA3 (jian1)
-9CA4 (li3)
-9CA5 (shi2)
-9CA6 (tiao2)
-9CA7 (gun3)
-9CA8 (sha1)
-9CA9 (huan4)
-9CAA (jun1)
-9CAB (ji4)
-9CAC (yong3)
-9CAD (qing1,zheng1)
-9CAE (ling2)
-9CAF (qi2)
-9CB0 (zou1)
-9CB1 (fei1)
-9CB2 (kun1)
-9CB3 (chang1)
-9CB4 (gu4)
-9CB5 (ni2)
-9CB6 (nian2)
-9CB7 (diao1)
-9CB8 (jing1)
-9CB9 (shen1)
-9CBA (shi1)
-9CBB (zi1)
-9CBC (fen4)
-9CBD (die2)
-9CBE (bi1)
-9CBF (chang2)
-9CC0 (ti2)
-9CC1 (wen1)
-9CC2 (wei1)
-9CC3 (sai1)
-9CC4 (e4)
-9CC5 (qiu1)
-9CC6 (fu4)
-9CC7 (huang2)
-9CC8 (quan2)
-9CC9 (jiang1)
-9CCA (bian1)
-9CCB (sao1)
-9CCC (ao2)
-9CCD (qi2)
-9CCE (ta3)
-9CCF (guan1)
-9CD0 (yao2)
-9CD1 (pang2)
-9CD2 (jian1)
-9CD3 (le4)
-9CD4 (biao4)
-9CD5 (xue3)
-9CD6 (bie1)
-9CD7 (man2)
-9CD8 (min3)
-9CD9 (yong1)
-9CDA (wei4)
-9CDB (xi2)
-9CDC (gui4)
-9CDD (shan4)
-9CDE (lin2)
-9CDF (zun1)
-9CE0 (hu4)
-9CE1 (gan3)
-9CE2 (li3)
-9CE3 (shan4)
-9CE4 (guan3)
-9CE5 (niao3)
-9CE6 (yi3)
-9CE7 (fu2)
-9CE8 (li4)
-9CE9 (jiu1)
-9CEA (bu3)
-9CEB (yan4)
-9CEC (fu2)
-9CED (diao1)
-9CEE (ji1)
-9CEF (feng4)
-9CF0 (none0)
-9CF1 (gan1)
-9CF2 (shi1)
-9CF3 (feng4)
-9CF4 (ming2)
-9CF5 (bao3)
-9CF6 (yuan1)
-9CF7 (zhi1)
-9CF8 (hu4)
-9CF9 (qian2)
-9CFA (fu1)
-9CFB (fen1)
-9CFC (wen2)
-9CFD (jian1)
-9CFE (shi1)
-9CFF (yu4)
-9D00 (fou3)
-9D01 (yiao1)
-9D02 (ju2)
-9D03 (jue2)
-9D04 (pi1)
-9D05 (huan1)
-9D06 (zhen4)
-9D07 (bao3)
-9D08 (yan4)
-9D09 (ya1)
-9D0A (zheng4)
-9D0B (fang1)
-9D0C (feng4)
-9D0D (wen2)
-9D0E (ou1)
-9D0F (te4)
-9D10 (jia1)
-9D11 (nu1)
-9D12 (ling2)
-9D13 (mie4)
-9D14 (fu2)
-9D15 (tuo2)
-9D16 (wen2)
-9D17 (li4)
-9D18 (bian4)
-9D19 (zhi4)
-9D1A (ge1)
-9D1B (yuan1)
-9D1C (zi1)
-9D1D (qu2)
-9D1E (xiao1)
-9D1F (chi1,zhi1)
-9D20 (dan4)
-9D21 (ju1)
-9D22 (you4)
-9D23 (gu1)
-9D24 (zhong1)
-9D25 (yu4)
-9D26 (yang1)
-9D27 (rong4)
-9D28 (ya1)
-9D29 (zhi4)
-9D2A (yu4)
-9D2B (none0)
-9D2C (ying1)
-9D2D (zhui1)
-9D2E (wu1)
-9D2F (er2)
-9D30 (gua1)
-9D31 (ai4)
-9D32 (zhi1)
-9D33 (yan4)
-9D34 (heng2)
-9D35 (jiao1)
-9D36 (ji2)
-9D37 (lie4)
-9D38 (zhu1)
-9D39 (ren2)
-9D3A (ti2)
-9D3B (hong2)
-9D3C (luo4)
-9D3D (ru2)
-9D3E (mou2)
-9D3F (ge1)
-9D40 (ren4)
-9D41 (jiao1)
-9D42 (xiu1)
-9D43 (zhou1)
-9D44 (chi1)
-9D45 (luo4)
-9D46 (none0)
-9D47 (none0)
-9D48 (none0)
-9D49 (luan2)
-9D4A (jia2)
-9D4B (ji4)
-9D4C (yu2)
-9D4D (huan1)
-9D4E (tuo3)
-9D4F (bu1)
-9D50 (wu2)
-9D51 (juan1)
-9D52 (yu4)
-9D53 (bo2)
-9D54 (xun4)
-9D55 (xun4)
-9D56 (bi4)
-9D57 (xi1)
-9D58 (jun4)
-9D59 (ju2)
-9D5A (tu2,tu1)
-9D5B (jing1)
-9D5C (ti2,ti4)
-9D5D (e2)
-9D5E (e2)
-9D5F (kuang2)
-9D60 (hu2,gu3)
-9D61 (wu3)
-9D62 (shen1)
-9D63 (la4)
-9D64 (none0)
-9D65 (none0)
-9D66 (lu4)
-9D67 (bing4)
-9D68 (shu1)
-9D69 (fu2)
-9D6A (an1)
-9D6B (zhao4)
-9D6C (peng2)
-9D6D (qin2)
-9D6E (qian1)
-9D6F (bei1)
-9D70 (diao1)
-9D71 (lu4)
-9D72 (que4,qiao3)
-9D73 (jian1)
-9D74 (ju2)
-9D75 (tu4)
-9D76 (ya1)
-9D77 (yuan1)
-9D78 (qi2)
-9D79 (li2)
-9D7A (ye4)
-9D7B (zhui1)
-9D7C (kong1)
-9D7D (duo4)
-9D7E (kun1)
-9D7F (sheng1)
-9D80 (qi2)
-9D81 (jing1)
-9D82 (ni2)
-9D83 (e4)
-9D84 (jing1)
-9D85 (zi1)
-9D86 (lai2)
-9D87 (dong1)
-9D88 (qi1)
-9D89 (chun2)
-9D8A (geng1)
-9D8B (ju1)
-9D8C (qu1)
-9D8D (none0)
-9D8E (none0)
-9D8F (ji1)
-9D90 (shu4)
-9D91 (none0)
-9D92 (chi3)
-9D93 (miao2)
-9D94 (rou2)
-9D95 (fu2)
-9D96 (qiu1)
-9D97 (ti2)
-9D98 (hu2)
-9D99 (ti2)
-9D9A (e4)
-9D9B (jie1)
-9D9C (mao2)
-9D9D (fu2)
-9D9E (chun1)
-9D9F (tu2)
-9DA0 (yan3)
-9DA1 (he2)
-9DA2 (yuan2)
-9DA3 (pian1,bin4)
-9DA4 (yun4)
-9DA5 (mei2)
-9DA6 (hu2)
-9DA7 (ying1)
-9DA8 (dun4)
-9DA9 (mu4,wu4)
-9DAA (ju2)
-9DAB (none0)
-9DAC (cang1)
-9DAD (fang3)
-9DAE (ge4)
-9DAF (ying1)
-9DB0 (yuan2)
-9DB1 (xuan1)
-9DB2 (weng1)
-9DB3 (shi1)
-9DB4 (he4,hao2)
-9DB5 (chu2)
-9DB6 (tang2)
-9DB7 (xia4)
-9DB8 (ruo4)
-9DB9 (liu2)
-9DBA (ji2)
-9DBB (gu3,hu2,gu2)
-9DBC (jian1)
-9DBD (zhun3)
-9DBE (han4)
-9DBF (zi1)
-9DC0 (ci2)
-9DC1 (yi4,ni4)
-9DC2 (yao4)
-9DC3 (yan4)
-9DC4 (ji1)
-9DC5 (li4,piao3)
-9DC6 (tian2)
-9DC7 (kou4)
-9DC8 (ti1)
-9DC9 (ti1)
-9DCA (ni4)
-9DCB (tu2)
-9DCC (ma3)
-9DCD (jiao1)
-9DCE (liu2)
-9DCF (zhen1)
-9DD0 (chen2)
-9DD1 (li4)
-9DD2 (zhuan1)
-9DD3 (zhe4)
-9DD4 (ao2)
-9DD5 (yao3)
-9DD6 (yi1)
-9DD7 (ou1)
-9DD8 (chi4)
-9DD9 (zhi4)
-9DDA (liao2,liu4)
-9DDB (rong2)
-9DDC (lou2)
-9DDD (bi4)
-9DDE (shuang1)
-9DDF (zhuo2)
-9DE0 (yu2)
-9DE1 (wu2)
-9DE2 (jue2)
-9DE3 (yin2)
-9DE4 (tan2)
-9DE5 (si1)
-9DE6 (jiao1)
-9DE7 (yi4)
-9DE8 (hua1)
-9DE9 (bi4)
-9DEA (ying1)
-9DEB (su4)
-9DEC (huang2)
-9DED (fan2)
-9DEE (jiao1)
-9DEF (liao2)
-9DF0 (yan4)
-9DF1 (kao1)
-9DF2 (jiu4)
-9DF3 (xian2)
-9DF4 (xian2)
-9DF5 (tu2)
-9DF6 (mai3)
-9DF7 (zun1)
-9DF8 (yu4)
-9DF9 (ying1)
-9DFA (lu4)
-9DFB (tuan2)
-9DFC (xian2)
-9DFD (xue2)
-9DFE (yi4)
-9DFF (pi4)
-9E00 (shu2)
-9E01 (luo2)
-9E02 (qi1)
-9E03 (yi2)
-9E04 (ji1)
-9E05 (zhe2)
-9E06 (yu2)
-9E07 (zhan1)
-9E08 (ye4)
-9E09 (yang2)
-9E0A (pi4)
-9E0B (ning2)
-9E0C (hu4)
-9E0D (mi2)
-9E0E (ying1)
-9E0F (meng2)
-9E10 (di2)
-9E11 (yue4)
-9E12 (yu2)
-9E13 (lei3)
-9E14 (bo2)
-9E15 (lu2)
-9E16 (he4)
-9E17 (long2)
-9E18 (shuang1)
-9E19 (yue4)
-9E1A (ying1)
-9E1B (guan4)
-9E1C (qu2)
-9E1D (li2)
-9E1E (luan2)
-9E1F (niao3,diao3)
-9E20 (jiu1)
-9E21 (ji1)
-9E22 (yuan1)
-9E23 (ming2)
-9E24 (shi1)
-9E25 (ou1)
-9E26 (ya1)
-9E27 (cang1)
-9E28 (bao3)
-9E29 (zhen4)
-9E2A (gu1)
-9E2B (dong1)
-9E2C (lu2)
-9E2D (ya1)
-9E2E (xiao1)
-9E2F (yang1)
-9E30 (ling2)
-9E31 (chi1)
-9E32 (qu2)
-9E33 (yuan1)
-9E34 (xue2)
-9E35 (tuo2)
-9E36 (si1)
-9E37 (zhi4)
-9E38 (er2)
-9E39 (gua1)
-9E3A (xiu1)
-9E3B (heng2)
-9E3C (zhou1)
-9E3D (ge1)
-9E3E (luan2)
-9E3F (hong2)
-9E40 (wu2)
-9E41 (bo2)
-9E42 (li2)
-9E43 (juan1)
-9E44 (hu2,gu3)
-9E45 (e2)
-9E46 (yu4)
-9E47 (xian2)
-9E48 (ti2)
-9E49 (wu3)
-9E4A (que4)
-9E4B (miao2)
-9E4C (an1)
-9E4D (kun1)
-9E4E (bei1)
-9E4F (peng2)
-9E50 (qian1)
-9E51 (chun2)
-9E52 (geng1)
-9E53 (yuan1)
-9E54 (su4)
-9E55 (hu2)
-9E56 (he2)
-9E57 (e4)
-9E58 (gu3,hu2)
-9E59 (qiu1)
-9E5A (ci2)
-9E5B (mei2)
-9E5C (wu4)
-9E5D (yi4)
-9E5E (yao4)
-9E5F (weng1)
-9E60 (liu2)
-9E61 (ji2)
-9E62 (yi4)
-9E63 (jian1)
-9E64 (he4)
-9E65 (yi1)
-9E66 (ying1)
-9E67 (zhe4)
-9E68 (liu4)
-9E69 (liao2)
-9E6A (jiao1)
-9E6B (jiu4)
-9E6C (yu4)
-9E6D (lu4)
-9E6E (huan2)
-9E6F (zhan1)
-9E70 (ying1)
-9E71 (hu4)
-9E72 (meng2)
-9E73 (guan4)
-9E74 (shuang1)
-9E75 (lu3)
-9E76 (jin1)
-9E77 (ling2)
-9E78 (jian3)
-9E79 (xian2)
-9E7A (cuo2)
-9E7B (jian3)
-9E7C (jian3)
-9E7D (yan2)
-9E7E (cuo2)
-9E7F (lu4)
-9E80 (you1)
-9E81 (cu1)
-9E82 (ji3)
-9E83 (biao1)
-9E84 (cu1)
-9E85 (pao2)
-9E86 (zhu4)
-9E87 (jun1,qun2)
-9E88 (zhu3)
-9E89 (jian1,qian1)
-9E8A (mi2)
-9E8B (mi2)
-9E8C (wu2)
-9E8D (liu2)
-9E8E (chen2)
-9E8F (jun1,qun2)
-9E90 (lin2)
-9E91 (ni2)
-9E92 (qi2)
-9E93 (lu4)
-9E94 (jiu4)
-9E95 (jun1,qun2)
-9E96 (jing1)
-9E97 (li4,li2)
-9E98 (xiang1)
-9E99 (yan2)
-9E9A (jia1)
-9E9B (mi2)
-9E9C (li4)
-9E9D (she4)
-9E9E (zhang1)
-9E9F (lin2)
-9EA0 (jing1)
-9EA1 (qi2)
-9EA2 (ling2)
-9EA3 (yan2)
-9EA4 (cu1)
-9EA5 (mai4)
-9EA6 (mai4)
-9EA7 (ge1)
-9EA8 (chao3)
-9EA9 (fu1)
-9EAA (mian4)
-9EAB (mian3)
-9EAC (fu1)
-9EAD (pao4)
-9EAE (qu4)
-9EAF (qu1,qu3)
-9EB0 (mou2)
-9EB1 (fu1)
-9EB2 (xian4)
-9EB3 (lai2)
-9EB4 (qu1,qu2)
-9EB5 (mian4)
-9EB6 (chi1,li2)
-9EB7 (feng1)
-9EB8 (fu1)
-9EB9 (qu1)
-9EBA (mian4)
-9EBB (ma2,ma1)
-9EBC (ma2,me5,mo5)
-9EBD (mo2,me5)
-9EBE (hui1)
-9EBF (none0)
-9EC0 (zou1)
-9EC1 (nen1)
-9EC2 (fen2)
-9EC3 (huang2)
-9EC4 (huang2)
-9EC5 (jin1)
-9EC6 (guang1)
-9EC7 (tian1)
-9EC8 (tou3)
-9EC9 (hong2)
-9ECA (xi1)
-9ECB (kuang4)
-9ECC (hong2)
-9ECD (shu3)
-9ECE (li2)
-9ECF (nian2)
-9ED0 (chi1,li2)
-9ED1 (hei1)
-9ED2 (hei1)
-9ED3 (yi4)
-9ED4 (qian2)
-9ED5 (zhen3)
-9ED6 (xi4)
-9ED7 (tuan3)
-9ED8 (mo4)
-9ED9 (mo4)
-9EDA (qian2)
-9EDB (dai4)
-9EDC (chu4)
-9EDD (you3)
-9EDE (dian3)
-9EDF (yi1)
-9EE0 (xia2)
-9EE1 (yan3)
-9EE2 (qu1)
-9EE3 (mei3)
-9EE4 (yan3)
-9EE5 (qing2,jing1)
-9EE6 (yu4)
-9EE7 (li2)
-9EE8 (dang3)
-9EE9 (du2)
-9EEA (can3)
-9EEB (yin1)
-9EEC (an4)
-9EED (yan3)
-9EEE (tan2)
-9EEF (an4)
-9EF0 (zhen3)
-9EF1 (dai4)
-9EF2 (can3)
-9EF3 (yi1)
-9EF4 (mei2)
-9EF5 (dan3)
-9EF6 (yan3)
-9EF7 (du2)
-9EF8 (lu2)
-9EF9 (zhi3)
-9EFA (fen3)
-9EFB (fu2)
-9EFC (fu3)
-9EFD (min3,mian3)
-9EFE (min3,mian3)
-9EFF (yuan2)
-9F00 (cu4)
-9F01 (qu4)
-9F02 (chao2)
-9F03 (wa1)
-9F04 (zhu1)
-9F05 (zhi1)
-9F06 (mang2)
-9F07 (ao2)
-9F08 (bie1)
-9F09 (tuo2)
-9F0A (bi4)
-9F0B (yuan2)
-9F0C (chao2)
-9F0D (tuo2)
-9F0E (ding3)
-9F0F (mi4)
-9F10 (nai4)
-9F11 (ding3)
-9F12 (zi1)
-9F13 (gu3,hu2)
-9F14 (gu3)
-9F15 (dong1)
-9F16 (fen2)
-9F17 (tao2)
-9F18 (yuan1)
-9F19 (pi2)
-9F1A (chang1)
-9F1B (gao1)
-9F1C (qi4)
-9F1D (yuan1)
-9F1E (tang1)
-9F1F (teng1)
-9F20 (shu3)
-9F21 (shu3)
-9F22 (fen2)
-9F23 (fei4)
-9F24 (wen2)
-9F25 (ba2)
-9F26 (diao1)
-9F27 (tuo2)
-9F28 (tong2)
-9F29 (qu2)
-9F2A (sheng1)
-9F2B (shi2)
-9F2C (you4)
-9F2D (shi2)
-9F2E (ting2)
-9F2F (wu2)
-9F30 (nian4)
-9F31 (jing1)
-9F32 (hun2)
-9F33 (ju2)
-9F34 (yan3)
-9F35 (tu2)
-9F36 (si1)
-9F37 (xi1)
-9F38 (xian3)
-9F39 (yan3)
-9F3A (lei2)
-9F3B (bi2)
-9F3C (yao2)
-9F3D (yan3,qui2)
-9F3E (han1)
-9F3F (hui1)
-9F40 (wu4)
-9F41 (hou1)
-9F42 (xi4)
-9F43 (ge2)
-9F44 (zha1)
-9F45 (xiu4)
-9F46 (weng4)
-9F47 (zha1)
-9F48 (nong2)
-9F49 (nang4)
-9F4A (qi2,zhai1)
-9F4B (zhai1)
-9F4C (ji4)
-9F4D (zi1,ji1)
-9F4E (ji1)
-9F4F (ji1)
-9F50 (qi2,ji4,qi4)
-9F51 (ji1)
-9F52 (chi3)
-9F53 (chen3)
-9F54 (chen4)
-9F55 (he2)
-9F56 (ya2)
-9F57 (ken3)
-9F58 (xie4)
-9F59 (bao1)
-9F5A (ze2)
-9F5B (shi4)
-9F5C (zi1)
-9F5D (chi1)
-9F5E (nian4)
-9F5F (ju3)
-9F60 (tiao2)
-9F61 (ling2)
-9F62 (ling2)
-9F63 (chu1)
-9F64 (quan2)
-9F65 (xie4)
-9F66 (yin2,ken3)
-9F67 (nie4)
-9F68 (jiu4)
-9F69 (nie4)
-9F6A (chuo4)
-9F6B (kun3)
-9F6C (yu3)
-9F6D (chu3)
-9F6E (yi3)
-9F6F (ni2)
-9F70 (cuo4)
-9F71 (chuo4)
-9F72 (qu3)
-9F73 (nian3)
-9F74 (xian3)
-9F75 (yu2)
-9F76 (e4)
-9F77 (wo4)
-9F78 (yi4)
-9F79 (chi1)
-9F7A (zou1)
-9F7B (dian1)
-9F7C (chu3)
-9F7D (jin4)
-9F7E (ya4)
-9F7F (chi3)
-9F80 (chen4)
-9F81 (he2)
-9F82 (yin2)
-9F83 (ju3)
-9F84 (ling2)
-9F85 (bao1)
-9F86 (tiao2)
-9F87 (zi1)
-9F88 (yin2,ken3)
-9F89 (yu3)
-9F8A (chuo4)
-9F8B (qu3)
-9F8C (wo4)
-9F8D (long2)
-9F8E (pang2)
-9F8F (gong1)
-9F90 (pang2)
-9F91 (yan3)
-9F92 (long2)
-9F93 (long2)
-9F94 (gong1)
-9F95 (kan1)
-9F96 (ta4)
-9F97 (ling2)
-9F98 (ta4)
-9F99 (long2)
-9F9A (gong1)
-9F9B (kan1)
-9F9C (gui1,jun1,qiu1)
-9F9D (qiu1)
-9F9E (bie1)
-9F9F (gui1,jun1,qiu1)
-9FA0 (yue4)
-9FA1 (chui1)
-9FA2 (he2)
-9FA3 (jue2)
-9FA4 (xie2)
-9FA5 (yue4)
diff --git a/Flow.Launcher.Plugin/ActionContext.cs b/Flow.Launcher.Plugin/ActionContext.cs
index b9e499d2b..d898972da 100644
--- a/Flow.Launcher.Plugin/ActionContext.cs
+++ b/Flow.Launcher.Plugin/ActionContext.cs
@@ -1,4 +1,6 @@
-namespace Flow.Launcher.Plugin
+using System.Windows.Input;
+
+namespace Flow.Launcher.Plugin
{
public class ActionContext
{
@@ -11,5 +13,13 @@
public bool ShiftPressed { get; set; }
public bool AltPressed { get; set; }
public bool WinPressed { get; set; }
+
+ public ModifierKeys ToModifierKeys()
+ {
+ return (CtrlPressed ? ModifierKeys.Control : ModifierKeys.None) |
+ (ShiftPressed ? ModifierKeys.Shift : ModifierKeys.None) |
+ (AltPressed ? ModifierKeys.Alt : ModifierKeys.None) |
+ (WinPressed ? ModifierKeys.Windows : ModifierKeys.None);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/AllowedLanguage.cs b/Flow.Launcher.Plugin/AllowedLanguage.cs
index 827958a7b..d5eea4fa5 100644
--- a/Flow.Launcher.Plugin/AllowedLanguage.cs
+++ b/Flow.Launcher.Plugin/AllowedLanguage.cs
@@ -1,38 +1,65 @@
-namespace Flow.Launcher.Plugin
+using System;
+
+namespace Flow.Launcher.Plugin
{
+ ///
+ /// Allowed plugin languages
+ ///
public static class AllowedLanguage
{
- public static string Python
- {
- get { return "PYTHON"; }
- }
+ ///
+ /// Python
+ ///
+ public const string Python = "Python";
- public static string CSharp
- {
- get { return "CSHARP"; }
- }
+ ///
+ /// C#
+ ///
+ public const string CSharp = "CSharp";
- public static string FSharp
- {
- get { return "FSHARP"; }
- }
+ ///
+ /// F#
+ ///
+ public const string FSharp = "FSharp";
- public static string Executable
- {
- get { return "EXECUTABLE"; }
- }
+ ///
+ /// Standard .exe
+ ///
+ public const string Executable = "Executable";
+ ///
+ /// TypeScript
+ ///
+ public const string TypeScript = "TypeScript";
+
+ ///
+ /// JavaScript
+ ///
+ public const string JavaScript = "JavaScript";
+
+ ///
+ /// Determines if this language is a .NET language
+ ///
+ ///
+ ///
public static bool IsDotNet(string language)
{
- return language.ToUpper() == CSharp
- || language.ToUpper() == FSharp;
+ return language.Equals(CSharp, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(FSharp, StringComparison.OrdinalIgnoreCase);
}
+ ///
+ /// Determines if this language is supported
+ ///
+ ///
+ ///
public static bool IsAllowed(string language)
{
return IsDotNet(language)
- || language.ToUpper() == Python.ToUpper()
- || language.ToUpper() == Executable.ToUpper();
+ || language.Equals(Python, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(Executable, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(TypeScript, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(JavaScript, StringComparison.OrdinalIgnoreCase);
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/BaseModel.cs b/Flow.Launcher.Plugin/BaseModel.cs
index 5bb558702..a4d666ced 100644
--- a/Flow.Launcher.Plugin/BaseModel.cs
+++ b/Flow.Launcher.Plugin/BaseModel.cs
@@ -4,14 +4,24 @@ using JetBrains.Annotations;
namespace Flow.Launcher.Plugin
{
+ ///
+ /// Base model for plugin classes
+ ///
public class BaseModel : INotifyPropertyChanged
{
+ ///
+ /// Property changed event handler
+ ///
public event PropertyChangedEventHandler PropertyChanged;
+ ///
+ /// Invoked when a property changes
+ ///
+ ///
[NotifyPropertyChangedInvocator]
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/EventHandler.cs b/Flow.Launcher.Plugin/EventHandler.cs
index 476668584..009e1721c 100644
--- a/Flow.Launcher.Plugin/EventHandler.cs
+++ b/Flow.Launcher.Plugin/EventHandler.cs
@@ -3,9 +3,24 @@ using System.Windows.Input;
namespace Flow.Launcher.Plugin
{
+ ///
+ /// Delegate for key down event
+ ///
+ ///
public delegate void FlowLauncherKeyDownEventHandler(FlowLauncherKeyDownEventArgs e);
+
+ ///
+ /// Delegate for query event
+ ///
+ ///
public delegate void AfterFlowLauncherQueryEventHandler(FlowLauncherQueryEventArgs e);
+ ///
+ /// Delegate for drop events [unused?]
+ ///
+ ///
+ ///
+ ///
public delegate void ResultItemDropEventHandler(Result result, IDataObject dropObject, DragEventArgs e);
///
@@ -17,14 +32,30 @@ namespace Flow.Launcher.Plugin
/// return true to continue handling, return false to intercept system handling
public delegate bool FlowLauncherGlobalKeyboardEventHandler(int keyevent, int vkcode, SpecialKeyState state);
+ ///
+ /// Arguments container for the Key Down event
+ ///
public class FlowLauncherKeyDownEventArgs
{
+ ///
+ /// The actual query
+ ///
public string Query { get; set; }
+
+ ///
+ /// Relevant key events for this event
+ ///
public KeyEventArgs keyEventArgs { get; set; }
}
+ ///
+ /// Arguments container for the Query event
+ ///
public class FlowLauncherQueryEventArgs
{
+ ///
+ /// The actual query
+ ///
public Query Query { get; set; }
}
}
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 6bab0583d..f3fc31ed8 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -1,7 +1,7 @@
- net5.0-windows
+ net7.0-windows
{8451ECDD-2EA4-4966-BB0A-7BBC40138E80}
true
Library
@@ -14,10 +14,10 @@
- 2.1.1
- 2.1.1
- 2.1.1
- 2.1.1
+ 4.0.0
+ 4.0.0
+ 4.0.0
+ 4.0.0
Flow.Launcher.Plugin
Flow-Launcher
MIT
@@ -65,8 +65,8 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
diff --git a/Flow.Launcher.Plugin/Interfaces/IAsyncReloadable.cs b/Flow.Launcher.Plugin/Interfaces/IAsyncReloadable.cs
index bd4500a7e..3d5f44a0d 100644
--- a/Flow.Launcher.Plugin/Interfaces/IAsyncReloadable.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IAsyncReloadable.cs
@@ -15,6 +15,10 @@ namespace Flow.Launcher.Plugin
///
public interface IAsyncReloadable : IFeatures
{
+ ///
+ /// Reload plugin data
+ ///
+ ///
Task ReloadDataAsync();
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 986710ab8..d9cf68469 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -1,7 +1,8 @@
-using Flow.Launcher.Plugin.SharedModels;
+using Flow.Launcher.Plugin.SharedModels;
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -41,7 +42,7 @@ namespace Flow.Launcher.Plugin
///
/// Copy Text to clipboard
///
- /// Text to save on clipboard
+ /// Text to save on clipboard
public void CopyToClipboard(string text);
///
@@ -163,6 +164,7 @@ namespace Flow.Launcher.Plugin
/// Download the specific url to a cretain file path
///
/// URL to download file
+ /// path to save downloaded file
/// place to store file
/// Task showing the progress
Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath, CancellationToken token = default);
@@ -178,9 +180,16 @@ namespace Flow.Launcher.Plugin
/// Remove ActionKeyword for specific plugin
///
/// ID for plugin that needs to remove action keyword
- /// The actionkeyword that is supposed to be removed
+ /// The actionkeyword that is supposed to be removed
void RemoveActionKeyword(string pluginId, string oldActionKeyword);
+ ///
+ /// Check whether specific ActionKeyword is assigned to any of the plugin
+ ///
+ /// The actionkeyword for checking
+ /// True if the actionkeyword is already assigned, False otherwise
+ bool ActionKeywordAssigned(string actionKeyword);
+
///
/// Log debug message
/// Message will only be logged in Debug mode
@@ -224,16 +233,30 @@ namespace Flow.Launcher.Plugin
/// Open directory in an explorer configured by user via Flow's Settings. The default is Windows Explorer
///
/// Directory Path to open
- /// Extra FileName Info
- public void OpenDirectory(string DirectoryPath, string FileName = null);
+ /// Extra FileName Info
+ public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null);
///
- /// Opens the url. The browser and mode used is based on what's configured in Flow's default browser settings.
+ /// Opens the URL with the given Uri object.
+ /// The browser and mode used is based on what's configured in Flow's default browser settings.
+ ///
+ public void OpenUrl(Uri url, bool? inPrivate = null);
+
+ ///
+ /// Opens the URL with the given string.
+ /// The browser and mode used is based on what's configured in Flow's default browser settings.
+ /// Non-C# plugins should use this method.
///
public void OpenUrl(string url, bool? inPrivate = null);
///
- /// Opens the application URI.
+ /// Opens the application URI with the given Uri object, e.g. obsidian://search-query-example
+ ///
+ public void OpenAppUri(Uri appUri);
+
+ ///
+ /// Opens the application URI with the given string, e.g. obsidian://search-query-example
+ /// Non-C# plugins should use this method
///
public void OpenAppUri(string appUri);
}
diff --git a/Flow.Launcher.Plugin/Interfaces/IReloadable.cs b/Flow.Launcher.Plugin/Interfaces/IReloadable.cs
index bd1ad406e..707f8d92c 100644
--- a/Flow.Launcher.Plugin/Interfaces/IReloadable.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IReloadable.cs
@@ -17,6 +17,9 @@
///
public interface IReloadable : IFeatures
{
+ ///
+ /// Synchronously reload plugin data
+ ///
void ReloadData();
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/Properties/AssemblyInfo.cs b/Flow.Launcher.Plugin/Properties/AssemblyInfo.cs
index 4cdadffc9..0a602a472 100644
--- a/Flow.Launcher.Plugin/Properties/AssemblyInfo.cs
+++ b/Flow.Launcher.Plugin/Properties/AssemblyInfo.cs
@@ -2,4 +2,4 @@
[assembly: InternalsVisibleTo("Flow.Launcher")]
[assembly: InternalsVisibleTo("Flow.Launcher.Core")]
-[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
\ No newline at end of file
+[assembly: InternalsVisibleTo("Flow.Launcher.Test")]
diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs
index 3fcf3c1d7..95547d273 100644
--- a/Flow.Launcher.Plugin/Query.cs
+++ b/Flow.Launcher.Plugin/Query.cs
@@ -16,7 +16,9 @@ namespace Flow.Launcher.Plugin
{
Search = search;
RawQuery = rawQuery;
+#pragma warning disable CS0618
Terms = terms;
+#pragma warning restore CS0618
SearchTerms = searchTerms;
ActionKeyword = actionKeyword;
}
@@ -98,4 +100,4 @@ namespace Flow.Launcher.Plugin
public override string ToString() => RawQuery;
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index 4a5eb39af..1c4467762 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -1,11 +1,15 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
+using System.Threading.Tasks;
+using System.Windows.Controls;
using System.Windows.Media;
namespace Flow.Launcher.Plugin
{
-
+ ///
+ /// Describes the result of a plugin
+ ///
public class Result
{
@@ -34,7 +38,11 @@ namespace Flow.Launcher.Plugin
/// user's clipboard when Ctrl + C is pressed on a result. If the text is a file/directory path
/// flow will copy the actual file/folder instead of just the path text.
///
- public string CopyText { get; set; } = string.Empty;
+ public string CopyText
+ {
+ get => string.IsNullOrEmpty(_copyText) ? SubTitle : _copyText;
+ set => _copyText = value;
+ }
///
/// This holds the text which can be provided by plugin to help Flow autocomplete text
@@ -53,9 +61,14 @@ namespace Flow.Launcher.Plugin
get { return _icoPath; }
set
{
- if (!string.IsNullOrEmpty(PluginDirectory) && !Path.IsPathRooted(value))
+ // As a standard this property will handle prepping and converting to absolute local path for icon image processing
+ if (!string.IsNullOrEmpty(value)
+ && !string.IsNullOrEmpty(PluginDirectory)
+ && !Path.IsPathRooted(value)
+ && !value.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
+ && !value.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
- _icoPath = Path.Combine(value, IcoPath);
+ _icoPath = Path.Combine(PluginDirectory, value);
}
else
{
@@ -63,13 +76,22 @@ namespace Flow.Launcher.Plugin
}
}
}
+ ///
+ /// Determines if Icon has a border radius
+ ///
+ public bool RoundedIcon { get; set; } = false;
+ ///
+ /// Delegate function, see
+ ///
+ ///
public delegate ImageSource IconDelegate();
///
/// Delegate to Get Image Source
///
public IconDelegate Icon;
+ private string _copyText = string.Empty;
///
/// Information for Glyph Icon (Prioritized than IcoPath/Icon if user enable Glyph Icons)
@@ -85,6 +107,14 @@ namespace Flow.Launcher.Plugin
///
public Func Action { get; set; }
+ ///
+ /// Delegate. An Async action to take in the form of a function call when the result has been selected
+ ///
+ /// true to hide flowlauncher after select result
+ ///
+ ///
+ public Func> AsyncAction { get; set; }
+
///
/// Priority of the current result
/// default: 0
@@ -96,6 +126,9 @@ namespace Flow.Launcher.Plugin
///
public IList TitleHighlightData { get; set; }
+ ///
+ /// Deprecated as of Flow Launcher v1.9.1. Subtitle highlighting is no longer offered
+ ///
[Obsolete("Deprecated as of Flow Launcher v1.9.1. Subtitle highlighting is no longer offered")]
public IList SubTitleHighlightData { get; set; }
@@ -113,10 +146,11 @@ namespace Flow.Launcher.Plugin
set
{
_pluginDirectory = value;
- if (!string.IsNullOrEmpty(IcoPath) && !Path.IsPathRooted(IcoPath))
- {
- IcoPath = Path.Combine(value, IcoPath);
- }
+
+ // When the Result object is returned from the query call, PluginDirectory is not provided until
+ // UpdatePluginMetadata call is made at PluginManager.cs L196. Once the PluginDirectory becomes available
+ // we need to update (only if not Uri path) the IcoPath with the full absolute path so the image can be loaded.
+ IcoPath = _icoPath;
}
}
@@ -144,7 +178,7 @@ namespace Flow.Launcher.Plugin
///
public override string ToString()
{
- return Title + SubTitle;
+ return Title + SubTitle + Score;
}
///
@@ -169,5 +203,58 @@ namespace Flow.Launcher.Plugin
/// Show message as ToolTip on result SubTitle hover over
///
public string SubTitleToolTip { get; set; }
+
+ ///
+ /// Customized Preview Panel
+ ///
+ public Lazy PreviewPanel { get; set; }
+
+ ///
+ /// Run this result, asynchronously
+ ///
+ ///
+ ///
+ public ValueTask ExecuteAsync(ActionContext context)
+ {
+ return AsyncAction?.Invoke(context) ?? ValueTask.FromResult(Action?.Invoke(context) ?? false);
+ }
+
+ ///
+ /// Progress bar display. Providing an int value between 0-100 will trigger the progress bar to be displayed on the result
+ ///
+ public int? ProgressBar { get; set; }
+
+ ///
+ /// Optionally set the color of the progress bar
+ ///
+ /// #26a0da (blue)
+ public string ProgressBarColor { get; set; } = "#26a0da";
+
+ public PreviewInfo Preview { get; set; } = PreviewInfo.Default;
+
+ ///
+ /// Info of the preview image.
+ ///
+ public record PreviewInfo
+ {
+ ///
+ /// Full image used for preview panel
+ ///
+ public string PreviewImagePath { get; set; }
+ ///
+ /// Determines if the preview image should occupy the full width of the preview panel.
+ ///
+ public bool IsMedia { get; set; }
+ public string Description { get; set; }
+ public IconDelegate PreviewDelegate { get; set; }
+
+ public static PreviewInfo Default { get; } = new()
+ {
+ PreviewImagePath = null,
+ Description = null,
+ IsMedia = false,
+ PreviewDelegate = null,
+ };
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs
index be33bd86c..dd4dcc7a4 100644
--- a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs
@@ -1,16 +1,19 @@
using System;
using System.Diagnostics;
using System.IO;
+#pragma warning disable IDE0005
using System.Windows;
+#pragma warning restore IDE0005
namespace Flow.Launcher.Plugin.SharedCommands
{
+ ///
+ /// Commands that are useful to run on files... and folders!
+ ///
public static class FilesFolders
{
private const string FileExplorerProgramName = "explorer";
- private const string FileExplorerProgramEXE = "explorer.exe";
-
///
/// Copies the folder and all of its files and folders
/// including subfolders to the target location
@@ -53,10 +56,10 @@ namespace Flow.Launcher.Plugin.SharedCommands
CopyAll(subdir.FullName, temppath);
}
}
- catch (Exception e)
+ catch (Exception)
{
#if DEBUG
- throw e;
+ throw;
#else
MessageBox.Show(string.Format("Copying path {0} has failed, it will now be deleted for consistency", targetPath));
RemoveFolderIfExists(targetPath);
@@ -65,6 +68,13 @@ namespace Flow.Launcher.Plugin.SharedCommands
}
+ ///
+ /// Check if the files and directories are identical between
+ /// and
+ ///
+ ///
+ ///
+ ///
public static bool VerifyBothFolderFilesEqual(this string fromPath, string toPath)
{
try
@@ -80,10 +90,10 @@ namespace Flow.Launcher.Plugin.SharedCommands
return true;
}
- catch (Exception e)
+ catch (Exception)
{
#if DEBUG
- throw e;
+ throw;
#else
MessageBox.Show(string.Format("Unable to verify folders and files between {0} and {1}", fromPath, toPath));
return false;
@@ -92,6 +102,10 @@ namespace Flow.Launcher.Plugin.SharedCommands
}
+ ///
+ /// Deletes a folder if it exists
+ ///
+ ///
public static void RemoveFolderIfExists(this string path)
{
try
@@ -99,47 +113,91 @@ namespace Flow.Launcher.Plugin.SharedCommands
if (Directory.Exists(path))
Directory.Delete(path, true);
}
- catch (Exception e)
+ catch (Exception)
{
#if DEBUG
- throw e;
+ throw;
#else
MessageBox.Show(string.Format("Not able to delete folder {0}, please go to the location and manually delete it", path));
#endif
}
}
+ ///
+ /// Checks if a directory exists
+ ///
+ ///
+ ///
public static bool LocationExists(this string path)
{
return Directory.Exists(path);
}
+ ///
+ /// Checks if a file exists
+ ///
+ ///
+ ///
public static bool FileExists(this string filePath)
{
return File.Exists(filePath);
}
+ ///
+ /// Open a directory window (using the OS's default handler, usually explorer)
+ ///
+ ///
public static void OpenPath(string fileOrFolderPath)
{
- var psi = new ProcessStartInfo { FileName = FileExplorerProgramName, UseShellExecute = true, Arguments = '"' + fileOrFolderPath + '"' };
+ var psi = new ProcessStartInfo
+ {
+ FileName = FileExplorerProgramName,
+ UseShellExecute = true,
+ Arguments = '"' + fileOrFolderPath + '"'
+ };
try
{
if (LocationExists(fileOrFolderPath) || FileExists(fileOrFolderPath))
Process.Start(psi);
}
- catch (Exception e)
+ catch (Exception)
{
#if DEBUG
- throw e;
+ throw;
#else
MessageBox.Show(string.Format("Unable to open the path {0}, please check if it exists", fileOrFolderPath));
#endif
}
}
- public static void OpenContainingFolder(string path)
+ ///
+ /// Open a file with associated application
+ ///
+ /// File path
+ /// Working directory
+ /// Open as Administrator
+ public static void OpenFile(string filePath, string workingDir = "", bool asAdmin = false)
{
- Process.Start(FileExplorerProgramEXE, $" /select,\"{path}\"");
+ var psi = new ProcessStartInfo
+ {
+ FileName = filePath,
+ UseShellExecute = true,
+ WorkingDirectory = workingDir,
+ Verb = asAdmin ? "runas" : string.Empty
+ };
+ try
+ {
+ if (FileExists(filePath))
+ Process.Start(psi);
+ }
+ catch (Exception)
+ {
+#if DEBUG
+ throw;
+#else
+ MessageBox.Show(string.Format("Unable to open the path {0}, please check if it exists", filePath));
+#endif
+ }
}
///
@@ -174,22 +232,16 @@ namespace Flow.Launcher.Plugin.SharedCommands
///
public static string GetPreviousExistingDirectory(Func locationExists, string path)
{
- var previousDirectoryPath = "";
var index = path.LastIndexOf('\\');
if (index > 0 && index < (path.Length - 1))
{
- previousDirectoryPath = path.Substring(0, index + 1);
- if (!locationExists(previousDirectoryPath))
- {
- return "";
- }
+ string previousDirectoryPath = path.Substring(0, index + 1);
+ return locationExists(previousDirectoryPath) ? previousDirectoryPath : "";
}
else
{
return "";
}
-
- return previousDirectoryPath;
}
///
@@ -209,5 +261,33 @@ namespace Flow.Launcher.Plugin.SharedCommands
return path;
}
+
+ ///
+ /// Returns if contains .
+ /// From https://stackoverflow.com/a/66877016
+ ///
+ /// Parent path
+ /// Sub path
+ /// If , when and are equal, returns
+ ///
+ public static bool PathContains(string parentPath, string subPath, bool allowEqual = false)
+ {
+ var rel = Path.GetRelativePath(parentPath.EnsureTrailingSlash(), subPath);
+ return (rel != "." || allowEqual)
+ && rel != ".."
+ && !rel.StartsWith("../")
+ && !rel.StartsWith(@"..\")
+ && !Path.IsPathRooted(rel);
+ }
+
+ ///
+ /// Returns path ended with "\"
+ ///
+ ///
+ ///
+ public static string EnsureTrailingSlash(this string path)
+ {
+ return path.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;
+ }
}
}
diff --git a/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs b/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
index a2eea19a7..c18f8b90c 100644
--- a/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
@@ -1,6 +1,8 @@
-using System;
+using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Diagnostics;
+using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
@@ -87,7 +89,8 @@ namespace Flow.Launcher.Plugin.SharedCommands
///
/// Runs a windows command using the provided ProcessStartInfo using a custom execute command function
///
- /// allows you to pass in a custom command execution function
+ /// allows you to pass in a custom command execution function
+ /// allows you to pass in the info that will be passed to startProcess
/// Thrown when unable to find the file specified in the command
/// Thrown when error occurs during the execution of the command
public static void Execute(Func startProcess, ProcessStartInfo info)
diff --git a/Flow.Launcher.Test/FilesFoldersTest.cs b/Flow.Launcher.Test/FilesFoldersTest.cs
new file mode 100644
index 000000000..d16826053
--- /dev/null
+++ b/Flow.Launcher.Test/FilesFoldersTest.cs
@@ -0,0 +1,53 @@
+using Flow.Launcher.Plugin.SharedCommands;
+using NUnit.Framework;
+
+namespace Flow.Launcher.Test
+{
+ [TestFixture]
+
+ public class FilesFoldersTest
+ {
+ // Testcases from https://stackoverflow.com/a/31941905/20703207
+ // Disk
+ [TestCase(@"c:", @"c:\foo", true)]
+ [TestCase(@"c:\", @"c:\foo", true)]
+ // Slash
+ [TestCase(@"c:\foo\bar\", @"c:\foo\", false)]
+ [TestCase(@"c:\foo\bar", @"c:\foo\", false)]
+ [TestCase(@"c:\foo", @"c:\foo\bar", true)]
+ [TestCase(@"c:\foo\", @"c:\foo\bar", true)]
+ // File
+ [TestCase(@"c:\foo", @"c:\foo\a.txt", true)]
+ [TestCase(@"c:\foo", @"c:/foo/a.txt", true)]
+ [TestCase(@"c:\FOO\a.txt", @"c:\foo", false)]
+ [TestCase(@"c:\foo\a.txt", @"c:\foo\", false)]
+ [TestCase(@"c:\foobar\a.txt", @"c:\foo", false)]
+ [TestCase(@"c:\foobar\a.txt", @"c:\foo\", false)]
+ [TestCase(@"c:\foo\", @"c:\foo.txt", false)]
+ // Prefix
+ [TestCase(@"c:\foo", @"c:\foobar", false)]
+ [TestCase(@"C:\Program", @"C:\Program Files\", false)]
+ [TestCase(@"c:\foobar", @"c:\foo\a.txt", false)]
+ [TestCase(@"c:\foobar\", @"c:\foo\a.txt", false)]
+ // Edge case
+ [TestCase(@"c:\foo", @"c:\foo\..\bar\baz", false)]
+ [TestCase(@"c:\bar", @"c:\foo\..\bar\baz", true)]
+ [TestCase(@"c:\barr", @"c:\foo\..\bar\baz", false)]
+ // Equality
+ [TestCase(@"c:\foo", @"c:\foo", false)]
+ [TestCase(@"c:\foo\", @"c:\foo", false)]
+ [TestCase(@"c:\foo", @"c:\foo\", false)]
+ public void GivenTwoPaths_WhenCheckPathContains_ThenShouldBeExpectedResult(string parentPath, string path, bool expectedResult)
+ {
+ Assert.AreEqual(expectedResult, FilesFolders.PathContains(parentPath, path));
+ }
+
+ [TestCase(@"c:\foo", @"c:\foo", true)]
+ [TestCase(@"c:\foo\", @"c:\foo", true)]
+ [TestCase(@"c:\foo", @"c:\foo\", true)]
+ public void GivenTwoPathsAreTheSame_WhenCheckPathContains_ThenShouldBeTrue(string parentPath, string path, bool expectedResult)
+ {
+ Assert.AreEqual(expectedResult, FilesFolders.PathContains(parentPath, path, true));
+ }
+ }
+}
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index 8de0681c8..039947a9f 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -1,7 +1,7 @@
- net5.0-windows10.0.19041.0
+ net7.0-windows10.0.19041.0
{FF742965-9A80-41A5-B042-D6C7D3A21708}
Library
Properties
@@ -48,13 +48,13 @@
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
\ No newline at end of file
diff --git a/Flow.Launcher.Test/FuzzyMatcherTest.cs b/Flow.Launcher.Test/FuzzyMatcherTest.cs
index bbddcbd2a..d7f143218 100644
--- a/Flow.Launcher.Test/FuzzyMatcherTest.cs
+++ b/Flow.Launcher.Test/FuzzyMatcherTest.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
@@ -129,14 +129,20 @@ namespace Flow.Launcher.Test
}
}
+
+ ///
+ /// These are standard match scenarios
+ /// The intention of this test is provide a bench mark for how much the score has increased from a change.
+ /// Usually the increase in scoring should not be drastic, increase of less than 10 is acceptable.
+ ///
[TestCase(Chrome, Chrome, 157)]
- [TestCase(Chrome, LastIsChrome, 147)]
+ [TestCase(Chrome, LastIsChrome, 145)]
[TestCase("chro", HelpCureHopeRaiseOnMindEntityChrome, 50)]
[TestCase("chr", HelpCureHopeRaiseOnMindEntityChrome, 30)]
[TestCase(Chrome, UninstallOrChangeProgramsOnYourComputer, 21)]
[TestCase(Chrome, CandyCrushSagaFromKing, 0)]
- [TestCase("sql", MicrosoftSqlServerManagementStudio, 110)]
- [TestCase("sql manag", MicrosoftSqlServerManagementStudio, 121)] //double spacing intended
+ [TestCase("sql", MicrosoftSqlServerManagementStudio, 109)]
+ [TestCase("sql manag", MicrosoftSqlServerManagementStudio, 120)] //double spacing intended
public void WhenGivenQueryString_ThenShouldReturn_TheDesiredScoring(
string queryString, string compareString, int expectedScore)
{
@@ -275,7 +281,40 @@ namespace Flow.Launcher.Test
$"Query: \"{queryString}\"{Environment.NewLine} " +
$"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}" +
$"Should be greater than{Environment.NewLine}" +
- $"CompareString2: \"{compareString2}\", Score: {compareString1Result.Score}{Environment.NewLine}");
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
+ }
+
+ [TestCase("red", "red colour", "metro red")]
+ [TestCase("red", "this red colour", "this colour red")]
+ [TestCase("red", "this red colour", "this colour is very red")]
+ [TestCase("red", "this red colour", "this colour is surprisingly super awesome red and cool")]
+ [TestCase("red", "this colour is surprisingly super red very and cool", "this colour is surprisingly super very red and cool")]
+ public void WhenGivenTwoStrings_Scoring_ShouldGiveMoreWeightToTheStringCloserToIndexZero(
+ string queryString, string compareString1, string compareString2)
+ {
+ // When
+ var matcher = new StringMatcher { UserSettingSearchPrecision = SearchPrecisionScore.Regular };
+
+ // Given
+ var compareString1Result = matcher.FuzzyMatch(queryString, compareString1);
+ var compareString2Result = matcher.FuzzyMatch(queryString, compareString2);
+
+ Debug.WriteLine("");
+ Debug.WriteLine("###############################################");
+ Debug.WriteLine($"QueryString: \"{queryString}\"{Environment.NewLine}");
+ Debug.WriteLine(
+ $"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}");
+ Debug.WriteLine(
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
+ Debug.WriteLine("###############################################");
+ Debug.WriteLine("");
+
+ // Should
+ Assert.True(compareString1Result.Score > compareString2Result.Score,
+ $"Query: \"{queryString}\"{Environment.NewLine} " +
+ $"CompareString1: \"{compareString1}\", Score: {compareString1Result.Score}{Environment.NewLine}" +
+ $"Should be greater than{Environment.NewLine}" +
+ $"CompareString2: \"{compareString2}\", Score: {compareString2Result.Score}{Environment.NewLine}");
}
[TestCase("vim", "Vim", "ignoreDescription", "ignore.exe", "Vim Diff", "ignoreDescription", "ignore.exe")]
diff --git a/Flow.Launcher.Test/Plugins/ExplorerTest.cs b/Flow.Launcher.Test/Plugins/ExplorerTest.cs
index 9d7fccad9..e9d37433f 100644
--- a/Flow.Launcher.Test/Plugins/ExplorerTest.cs
+++ b/Flow.Launcher.Test/Plugins/ExplorerTest.cs
@@ -1,4 +1,4 @@
-using Flow.Launcher.Plugin;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.Explorer;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo;
@@ -7,8 +7,11 @@ using Flow.Launcher.Plugin.SharedCommands;
using NUnit.Framework;
using System;
using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;
+using static Flow.Launcher.Plugin.Explorer.Search.SearchManager;
namespace Flow.Launcher.Test.Plugins
{
@@ -19,10 +22,12 @@ namespace Flow.Launcher.Test.Plugins
[TestFixture]
public class ExplorerTest
{
+#pragma warning disable CS1998 // async method with no await (more readable to leave it async to match the tested signature)
private async Task> MethodWindowsIndexSearchReturnsZeroResultsAsync(Query dummyQuery, string dummyString, CancellationToken dummyToken)
{
return new List();
}
+#pragma warning restore CS1998
private List MethodDirectoryInfoClassSearchReturnsTwoResults(Query dummyQuery, string dummyString, CancellationToken token)
{
@@ -30,12 +35,11 @@ namespace Flow.Launcher.Test.Plugins
{
new Result
{
- Title="Result 1"
+ Title = "Result 1"
},
-
new Result
{
- Title="Result 2"
+ Title = "Result 2"
}
};
}
@@ -44,15 +48,13 @@ namespace Flow.Launcher.Test.Plugins
private bool PreviousLocationNotExistReturnsFalse(string dummyString) => false;
+ [SupportedOSPlatform("windows7.0")]
[TestCase("C:\\SomeFolder\\", "directory='file:C:\\SomeFolder\\'")]
public void GivenWindowsIndexSearch_WhenProvidedFolderPath_ThenQueryWhereRestrictionsShouldUseDirectoryString(string path, string expectedString)
{
- // Given
- var queryConstructor = new QueryConstructor(new Settings());
-
// When
var folderPath = path;
- var result = queryConstructor.QueryWhereRestrictionsForTopLevelDirectorySearch(folderPath);
+ var result = QueryConstructor.TopLevelDirectoryConstraint(folderPath);
// Then
Assert.IsTrue(result == expectedString,
@@ -60,6 +62,7 @@ namespace Flow.Launcher.Test.Plugins
$"Actual: {result}{Environment.NewLine}");
}
+ [SupportedOSPlatform("windows7.0")]
[TestCase("C:\\", "SELECT TOP 100 System.FileName, System.ItemUrl, System.ItemType FROM SystemIndex WHERE directory='file:C:\\' ORDER BY System.FileName")]
[TestCase("C:\\SomeFolder\\", "SELECT TOP 100 System.FileName, System.ItemUrl, System.ItemType FROM SystemIndex WHERE directory='file:C:\\SomeFolder\\' ORDER BY System.FileName")]
public void GivenWindowsIndexSearch_WhenSearchTypeIsTopLevelDirectorySearch_ThenQueryShouldUseExpectedString(string folderPath, string expectedString)
@@ -68,130 +71,68 @@ namespace Flow.Launcher.Test.Plugins
var queryConstructor = new QueryConstructor(new Settings());
//When
- var queryString = queryConstructor.QueryForTopLevelDirectorySearch(folderPath);
+ var queryString = queryConstructor.Directory(folderPath);
// Then
- Assert.IsTrue(queryString == expectedString,
+ Assert.IsTrue(queryString.Replace(" ", " ") == expectedString.Replace(" ", " "),
$"Expected string: {expectedString}{Environment.NewLine} " +
$"Actual string was: {queryString}{Environment.NewLine}");
}
- [TestCase("C:\\SomeFolder\\flow.launcher.sln", "SELECT TOP 100 System.FileName, System.ItemUrl, System.ItemType " +
- "FROM SystemIndex WHERE (System.FileName LIKE 'flow.launcher.sln%' " +
- "OR CONTAINS(System.FileName,'\"flow.launcher.sln*\"',1033))" +
- " AND directory='file:C:\\SomeFolder' ORDER BY System.FileName")]
+ [SupportedOSPlatform("windows7.0")]
+ [TestCase("C:\\SomeFolder", "flow.launcher.sln", "SELECT TOP 100 System.FileName, System.ItemUrl, System.ItemType" +
+ " FROM SystemIndex WHERE directory='file:C:\\SomeFolder'" +
+ " AND (System.FileName LIKE 'flow.launcher.sln%' OR CONTAINS(System.FileName,'\"flow.launcher.sln*\"'))" +
+ " ORDER BY System.FileName")]
public void GivenWindowsIndexSearchTopLevelDirectory_WhenSearchingForSpecificItem_ThenQueryShouldUseExpectedString(
- string userSearchString, string expectedString)
+ string folderPath, string userSearchString, string expectedString)
{
// Given
var queryConstructor = new QueryConstructor(new Settings());
//When
- var queryString = queryConstructor.QueryForTopLevelDirectorySearch(userSearchString);
+ var queryString = queryConstructor.Directory(folderPath, userSearchString);
// Then
- Assert.IsTrue(queryString == expectedString,
- $"Expected string: {expectedString}{Environment.NewLine} " +
- $"Actual string was: {queryString}{Environment.NewLine}");
- }
-
- [TestCase("C:\\SomeFolder\\SomeApp", "(System.FileName LIKE 'SomeApp%' " +
- "OR CONTAINS(System.FileName,'\"SomeApp*\"',1033))" +
- " AND directory='file:C:\\SomeFolder'")]
- public void GivenWindowsIndexSearchTopLevelDirectory_WhenSearchingForSpecificItem_ThenQueryWhereRestrictionsShouldUseDirectoryString(
- string userSearchString, string expectedString)
- {
- // Given
- var queryConstructor = new QueryConstructor(new Settings());
-
- //When
- var queryString = queryConstructor.QueryWhereRestrictionsForTopLevelDirectorySearch(userSearchString);
-
- // Then
- Assert.IsTrue(queryString == expectedString,
- $"Expected string: {expectedString}{Environment.NewLine} " +
- $"Actual string was: {queryString}{Environment.NewLine}");
+ Assert.AreEqual(expectedString, queryString);
}
+ [SupportedOSPlatform("windows7.0")]
[TestCase("scope='file:'")]
public void GivenWindowsIndexSearch_WhenSearchAllFoldersAndFiles_ThenQueryWhereRestrictionsShouldUseScopeString(string expectedString)
{
//When
- var resultString = QueryConstructor.QueryWhereRestrictionsForAllFilesAndFoldersSearch;
+ const string resultString = QueryConstructor.RestrictionsForAllFilesAndFoldersSearch;
// Then
- Assert.IsTrue(resultString == expectedString,
- $"Expected QueryWhereRestrictions string: {expectedString}{Environment.NewLine} " +
- $"Actual string was: {resultString}{Environment.NewLine}");
+ Assert.AreEqual(expectedString, resultString);
}
+ [SupportedOSPlatform("windows7.0")]
[TestCase("flow.launcher.sln", "SELECT TOP 100 \"System.FileName\", \"System.ItemUrl\", \"System.ItemType\" " +
- "FROM \"SystemIndex\" WHERE (System.FileName LIKE 'flow.launcher.sln%' " +
- "OR CONTAINS(System.FileName,'\"flow.launcher.sln*\"',1033)) AND scope='file:' ORDER BY System.FileName")]
+ "FROM \"SystemIndex\" WHERE (System.FileName LIKE 'flow.launcher.sln%' " +
+ "OR CONTAINS(System.FileName,'\"flow.launcher.sln*\"',1033)) AND scope='file:' ORDER BY System.FileName")]
+ [TestCase("", "SELECT TOP 100 \"System.FileName\", \"System.ItemUrl\", \"System.ItemType\" FROM \"SystemIndex\" WHERE WorkId IS NOT NULL AND scope='file:' ORDER BY System.FileName")]
public void GivenWindowsIndexSearch_WhenSearchAllFoldersAndFiles_ThenQueryShouldUseExpectedString(
string userSearchString, string expectedString)
{
// Given
var queryConstructor = new QueryConstructor(new Settings());
- var baseQuery = queryConstructor.CreateBaseQuery();
-
+ var baseQuery = queryConstructor.CreateBaseQuery();
+
// system running this test could have different locale than the hard-coded 1033 LCID en-US.
var queryKeywordLocale = baseQuery.QueryKeywordLocale;
expectedString = expectedString.Replace("1033", queryKeywordLocale.ToString());
-
-
//When
- var resultString = queryConstructor.QueryForAllFilesAndFolders(userSearchString);
+ var resultString = queryConstructor.FilesAndFolders(userSearchString);
// Then
- Assert.IsTrue(resultString == expectedString,
- $"Expected query string: {expectedString}{Environment.NewLine} " +
- $"Actual string was: {resultString}{Environment.NewLine}");
+ Assert.AreEqual(expectedString, resultString);
}
- [TestCase]
- public async Task GivenTopLevelDirectorySearch_WhenIndexSearchNotRequired_ThenSearchMethodShouldContinueDirectoryInfoClassSearch()
- {
- // Given
- var searchManager = new SearchManager(new Settings(), new PluginInitContext());
-
- // When
- var results = await searchManager.TopLevelDirectorySearchBehaviourAsync(
- MethodWindowsIndexSearchReturnsZeroResultsAsync,
- MethodDirectoryInfoClassSearchReturnsTwoResults,
- false,
- new Query(),
- "string not used",
- default);
-
- // Then
- Assert.IsTrue(results.Count == 2,
- $"Expected to have 2 results from DirectoryInfoClassSearch {Environment.NewLine} " +
- $"Actual number of results is {results.Count} {Environment.NewLine}");
- }
-
- [TestCase]
- public async Task GivenTopLevelDirectorySearch_WhenIndexSearchNotRequired_ThenSearchMethodShouldNotContinueDirectoryInfoClassSearch()
- {
- // Given
- var searchManager = new SearchManager(new Settings(), new PluginInitContext());
-
- // When
- var results = await searchManager.TopLevelDirectorySearchBehaviourAsync(
- MethodWindowsIndexSearchReturnsZeroResultsAsync,
- MethodDirectoryInfoClassSearchReturnsTwoResults,
- true,
- new Query(),
- "string not used",
- default);
-
- // Then
- Assert.IsTrue(results.Count == 0,
- $"Expected to have 0 results because location is indexed {Environment.NewLine} " +
- $"Actual number of results is {results.Count} {Environment.NewLine}");
- }
+ [SupportedOSPlatform("windows7.0")]
[TestCase(@"some words", @"FREETEXT('some words')")]
public void GivenWindowsIndexSearch_WhenQueryWhereRestrictionsIsForFileContentSearch_ThenShouldReturnFreeTextString(
string querySearchString, string expectedString)
@@ -200,7 +141,7 @@ namespace Flow.Launcher.Test.Plugins
var queryConstructor = new QueryConstructor(new Settings());
//When
- var resultString = queryConstructor.QueryWhereRestrictionsForFileContentSearch(querySearchString);
+ var resultString = QueryConstructor.RestrictionsForFileContentSearch(querySearchString);
// Then
Assert.IsTrue(resultString == expectedString,
@@ -208,8 +149,9 @@ namespace Flow.Launcher.Test.Plugins
$"Actual string was: {resultString}{Environment.NewLine}");
}
+ [SupportedOSPlatform("windows7.0")]
[TestCase("some words", "SELECT TOP 100 System.FileName, System.ItemUrl, System.ItemType " +
- "FROM SystemIndex WHERE FREETEXT('some words') AND scope='file:' ORDER BY System.FileName")]
+ "FROM SystemIndex WHERE FREETEXT('some words') AND scope='file:' ORDER BY System.FileName")]
public void GivenWindowsIndexSearch_WhenSearchForFileContent_ThenQueryShouldUseExpectedString(
string userSearchString, string expectedString)
{
@@ -217,7 +159,7 @@ namespace Flow.Launcher.Test.Plugins
var queryConstructor = new QueryConstructor(new Settings());
//When
- var resultString = queryConstructor.QueryForFileContentSearch(userSearchString);
+ var resultString = queryConstructor.FileContent(userSearchString);
// Then
Assert.IsTrue(resultString == expectedString,
@@ -228,7 +170,10 @@ namespace Flow.Launcher.Test.Plugins
public void GivenQuery_WhenActionKeywordForFileContentSearchExists_ThenFileContentSearchRequiredShouldReturnTrue()
{
// Given
- var query = new Query { ActionKeyword = "doc:", Search = "search term" };
+ var query = new Query
+ {
+ ActionKeyword = "doc:", Search = "search term"
+ };
var searchManager = new SearchManager(new Settings(), new PluginInitContext());
@@ -250,6 +195,7 @@ namespace Flow.Launcher.Test.Plugins
[TestCase(@"c:\>*", true)]
[TestCase(@"c:\>", true)]
[TestCase(@"c:\SomeLocation\SomeOtherLocation\>", true)]
+ [TestCase(@"c:\SomeLocation\SomeOtherLocation", true)]
public void WhenGivenQuerySearchString_ThenShouldIndicateIfIsLocationPathString(string querySearchString, bool expectedResult)
{
// When, Given
@@ -301,24 +247,19 @@ namespace Flow.Launcher.Test.Plugins
$"Actual path string is {returnedPath} {Environment.NewLine}");
}
- [TestCase("c:\\SomeFolder\\>", "scope='file:c:\\SomeFolder'")]
- [TestCase("c:\\SomeFolder\\>SomeName", "(System.FileName LIKE 'SomeName%' "
- + "OR CONTAINS(System.FileName,'\"SomeName*\"',1033)) AND "
- + "scope='file:c:\\SomeFolder'")]
- public void GivenWindowsIndexSearch_WhenSearchPatternHotKeyIsSearchAll_ThenQueryWhereRestrictionsShouldUseScopeString(string path, string expectedString)
+ [SupportedOSPlatform("windows7.0")]
+ [TestCase("c:\\SomeFolder", "scope='file:c:\\SomeFolder'")]
+ [TestCase("c:\\OtherFolder", "scope='file:c:\\OtherFolder'")]
+ public void GivenFilePath_WhenSearchPatternHotKeyIsSearchAll_ThenQueryWhereRestrictionsShouldUseScopeString(string path, string expectedString)
{
- // Given
- var queryConstructor = new QueryConstructor(new Settings());
-
//When
- var resultString = queryConstructor.QueryWhereRestrictionsForTopLevelDirectoryAllFilesAndFoldersSearch(path);
+ var resultString = QueryConstructor.RecursiveDirectoryConstraint(path);
// Then
- Assert.IsTrue(resultString == expectedString,
- $"Expected QueryWhereRestrictions string: {expectedString}{Environment.NewLine} " +
- $"Actual string was: {resultString}{Environment.NewLine}");
+ Assert.AreEqual(expectedString, resultString);
}
+ [SupportedOSPlatform("windows7.0")]
[TestCase("c:\\somefolder\\>somefile", "*somefile*")]
[TestCase("c:\\somefolder\\somefile", "somefile*")]
[TestCase("c:\\somefolder\\", "*")]
@@ -329,9 +270,194 @@ namespace Flow.Launcher.Test.Plugins
var resultString = DirectoryInfoSearch.ConstructSearchCriteria(path);
// Then
- Assert.IsTrue(resultString == expectedString,
- $"Expected criteria string: {expectedString}{Environment.NewLine} " +
- $"Actual criteria string was: {resultString}{Environment.NewLine}");
+ Assert.AreEqual(expectedString, resultString);
+ }
+
+ [TestCase("c:\\somefolder\\someotherfolder", ResultType.Folder, "irrelevant", false, true, "c:\\somefolder\\someotherfolder\\")]
+ [TestCase("c:\\somefolder\\someotherfolder\\", ResultType.Folder, "irrelevant", true, true, "c:\\somefolder\\someotherfolder\\")]
+ [TestCase("c:\\somefolder\\someotherfolder", ResultType.Folder, "irrelevant", true, false, "p c:\\somefolder\\someotherfolder\\")]
+ [TestCase("c:\\somefolder\\someotherfolder\\", ResultType.Folder, "irrelevant", false, false, "c:\\somefolder\\someotherfolder\\")]
+ [TestCase("c:\\somefolder\\someotherfolder", ResultType.Folder, "p", true, false, "p c:\\somefolder\\someotherfolder\\")]
+ [TestCase("c:\\somefolder\\someotherfolder", ResultType.Folder, "", true, true, "c:\\somefolder\\someotherfolder\\")]
+ public void GivenFolderResult_WhenGetPath_ThenPathShouldBeExpectedString(
+ string path,
+ ResultType type,
+ string actionKeyword,
+ bool pathSearchKeywordEnabled,
+ bool searchActionKeywordEnabled,
+ string expectedResult)
+ {
+ // Given
+ var settings = new Settings()
+ {
+ PathSearchKeywordEnabled = pathSearchKeywordEnabled,
+ PathSearchActionKeyword = "p",
+ SearchActionKeywordEnabled = searchActionKeywordEnabled,
+ SearchActionKeyword = Query.GlobalPluginWildcardSign
+ };
+ ResultManager.Init(new PluginInitContext(), settings);
+
+ // When
+ var result = ResultManager.GetPathWithActionKeyword(path, type, actionKeyword);
+
+ // Then
+ Assert.AreEqual(result, expectedResult);
+ }
+
+ [TestCase("c:\\somefolder\\somefile", ResultType.File, "irrelevant", false, true, "e c:\\somefolder\\somefile")]
+ [TestCase("c:\\somefolder\\somefile", ResultType.File, "p", true, false, "p c:\\somefolder\\somefile")]
+ [TestCase("c:\\somefolder\\somefile", ResultType.File, "e", true, true, "e c:\\somefolder\\somefile")]
+ [TestCase("c:\\somefolder\\somefile", ResultType.File, "irrelevant", false, false, "e c:\\somefolder\\somefile")]
+ public void GivenFileResult_WhenGetPath_ThenPathShouldBeExpectedString(
+ string path,
+ ResultType type,
+ string actionKeyword,
+ bool pathSearchKeywordEnabled,
+ bool searchActionKeywordEnabled,
+ string expectedResult)
+ {
+ // Given
+ var settings = new Settings()
+ {
+ PathSearchKeywordEnabled = pathSearchKeywordEnabled,
+ PathSearchActionKeyword = "p",
+ SearchActionKeywordEnabled = searchActionKeywordEnabled,
+ SearchActionKeyword = "e"
+ };
+ ResultManager.Init(new PluginInitContext(), settings);
+
+ // When
+ var result = ResultManager.GetPathWithActionKeyword(path, type, actionKeyword);
+
+ // Then
+ Assert.AreEqual(result, expectedResult);
+ }
+
+ [TestCase("somefolder", "c:\\somefolder\\", ResultType.Folder, "q", false, false, "q somefolder")]
+ [TestCase("somefolder", "c:\\somefolder\\", ResultType.Folder, "i", true, false, "p c:\\somefolder\\")]
+ [TestCase("somefolder", "c:\\somefolder\\", ResultType.Folder, "irrelevant", true, true, "c:\\somefolder\\")]
+ public void GivenQueryWithFolderTypeResult_WhenGetAutoComplete_ThenResultShouldBeExpectedString(
+ string title,
+ string path,
+ ResultType resultType,
+ string actionKeyword,
+ bool pathSearchKeywordEnabled,
+ bool searchActionKeywordEnabled,
+ string expectedResult)
+ {
+ // Given
+ var query = new Query() { ActionKeyword = actionKeyword };
+ var settings = new Settings()
+ {
+ PathSearchKeywordEnabled = pathSearchKeywordEnabled,
+ PathSearchActionKeyword = "p",
+ SearchActionKeywordEnabled = searchActionKeywordEnabled,
+ SearchActionKeyword = Query.GlobalPluginWildcardSign,
+ QuickAccessActionKeyword = "q",
+ IndexSearchActionKeyword = "i"
+ };
+ ResultManager.Init(new PluginInitContext(), settings);
+
+ // When
+ var result = ResultManager.GetAutoCompleteText(title, query, path, resultType);
+
+ // Then
+ Assert.AreEqual(result, expectedResult);
+ }
+
+ [TestCase("somefile", "c:\\somefolder\\somefile", ResultType.File, "q", false, false, "q somefile")]
+ [TestCase("somefile", "c:\\somefolder\\somefile", ResultType.File, "i", true, false, "p c:\\somefolder\\somefile")]
+ [TestCase("somefile", "c:\\somefolder\\somefile", ResultType.File, "irrelevant", true, true, "c:\\somefolder\\somefile")]
+ public void GivenQueryWithFileTypeResult_WhenGetAutoComplete_ThenResultShouldBeExpectedString(
+ string title,
+ string path,
+ ResultType resultType,
+ string actionKeyword,
+ bool pathSearchKeywordEnabled,
+ bool searchActionKeywordEnabled,
+ string expectedResult)
+ {
+ // Given
+ var query = new Query() { ActionKeyword = actionKeyword };
+ var settings = new Settings()
+ {
+ QuickAccessActionKeyword = "q",
+ IndexSearchActionKeyword = "i",
+ PathSearchActionKeyword = "p",
+ PathSearchKeywordEnabled = pathSearchKeywordEnabled,
+ SearchActionKeywordEnabled = searchActionKeywordEnabled,
+ SearchActionKeyword = Query.GlobalPluginWildcardSign
+ };
+ ResultManager.Init(new PluginInitContext(), settings);
+
+ // When
+ var result = ResultManager.GetAutoCompleteText(title, query, path, resultType);
+
+ // Then
+ Assert.AreEqual(result, expectedResult);
+ }
+
+ [TestCase(@"c:\foo", @"c:\foo", true)]
+ [TestCase(@"C:\Foo\", @"c:\foo\", true)]
+ [TestCase(@"c:\foo", @"c:\foo\", false)]
+ public void GivenTwoPaths_WhenCompared_ThenShouldBeExpectedSameOrDifferent(string path1, string path2, bool expectedResult)
+ {
+ // Given
+ var comparator = PathEqualityComparator.Instance;
+ var result1 = new Result
+ {
+ Title = Path.GetFileName(path1),
+ SubTitle = path1
+ };
+ var result2 = new Result
+ {
+ Title = Path.GetFileName(path2),
+ SubTitle = path2
+ };
+
+ // When, Then
+ Assert.AreEqual(expectedResult, comparator.Equals(result1, result2));
+ }
+
+ [TestCase(@"c:\foo\", @"c:\foo\")]
+ [TestCase(@"C:\Foo\", @"c:\foo\")]
+ public void GivenTwoPaths_WhenComparedHasCode_ThenShouldBeSame(string path1, string path2)
+ {
+ // Given
+ var comparator = PathEqualityComparator.Instance;
+ var result1 = new Result
+ {
+ Title = Path.GetFileName(path1),
+ SubTitle = path1
+ };
+ var result2 = new Result
+ {
+ Title = Path.GetFileName(path2),
+ SubTitle = path2
+ };
+
+ var hash1 = comparator.GetHashCode(result1);
+ var hash2 = comparator.GetHashCode(result2);
+
+ // When, Then
+ Assert.IsTrue(hash1 == hash2);
+ }
+
+ [TestCase(@"%appdata%", true)]
+ [TestCase(@"%appdata%\123", true)]
+ [TestCase(@"c:\foo %appdata%\", false)]
+ [TestCase(@"c:\users\%USERNAME%\downloads", true)]
+ [TestCase(@"c:\downloads", false)]
+ [TestCase(@"%", false)]
+ [TestCase(@"%%", false)]
+ [TestCase(@"%bla%blabla%", false)]
+ public void GivenPath_WhenHavingEnvironmentVariableOrNot_ThenShouldBeExpected(string path, bool expectedResult)
+ {
+ // When
+ var result = EnvironmentVariables.HasEnvironmentVar(path);
+
+ // Then
+ Assert.AreEqual(result, expectedResult);
}
}
}
diff --git a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
index 383650619..765280e08 100644
--- a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
+++ b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
@@ -1,4 +1,4 @@
-using NUnit;
+using NUnit;
using NUnit.Framework;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Plugin;
@@ -16,8 +16,6 @@ namespace Flow.Launcher.Test.Plugins
// ReSharper disable once InconsistentNaming
internal class JsonRPCPluginTest : JsonRPCPlugin
{
- public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
-
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
throw new System.NotImplementedException();
@@ -48,7 +46,7 @@ namespace Flow.Launcher.Test.Plugins
foreach (var result in results)
{
Assert.IsNotNull(result);
- Assert.IsNotNull(result.Action);
+ Assert.IsNotNull(result.AsyncAction);
Assert.IsNotNull(result.Title);
}
@@ -76,7 +74,7 @@ namespace Flow.Launcher.Test.Plugins
[TestCaseSource(typeof(JsonRPCPluginTest), nameof(ResponseModelsSource))]
public async Task GivenModel_WhenSerializeWithDifferentNamingPolicy_ThenExpectSameResult_Async(JsonRPCQueryResponseModel reference)
{
- var camelText = JsonSerializer.Serialize(reference, new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
+ var camelText = JsonSerializer.Serialize(reference, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
var pascalText = JsonSerializer.Serialize(reference);
@@ -92,7 +90,7 @@ namespace Flow.Launcher.Test.Plugins
Assert.AreEqual(result1, referenceResult);
Assert.IsNotNull(result1);
- Assert.IsNotNull(result1.Action);
+ Assert.IsNotNull(result1.AsyncAction);
}
}
diff --git a/Flow.Launcher.Test/Plugins/ProgramTest.cs b/Flow.Launcher.Test/Plugins/ProgramTest.cs
deleted file mode 100644
index a0d2243ce..000000000
--- a/Flow.Launcher.Test/Plugins/ProgramTest.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using Flow.Launcher.Plugin.Program.Programs;
-using NUnit.Framework;
-using System;
-using Windows.ApplicationModel;
-
-namespace Flow.Launcher.Test.Plugins
-{
- [TestFixture]
- public class ProgramTest
- {
- [TestCase("Microsoft.WindowsCamera", "ms-resource:LensSDK/Resources/AppTitle", "ms-resource://Microsoft.WindowsCamera/LensSDK/Resources/AppTitle")]
- [TestCase("microsoft.windowscommunicationsapps", "ms-resource://microsoft.windowscommunicationsapps/hxoutlookintl/AppManifest_MailDesktop_DisplayName",
- "ms-resource://microsoft.windowscommunicationsapps/hxoutlookintl/AppManifest_MailDesktop_DisplayName")]
- [TestCase("windows.immersivecontrolpanel", "ms-resource:DisplayName", "ms-resource://windows.immersivecontrolpanel/Resources/DisplayName")]
- [TestCase("Microsoft.MSPaint", "ms-resource:AppName", "ms-resource://Microsoft.MSPaint/Resources/AppName")]
- public void WhenGivenPriReferenceValueShouldReturnCorrectFormat(string packageName, string rawPriReferenceValue, string expectedFormat)
- {
- // Arrange
- var app = new UWP.Application();
-
- // Act
- var result = app.FormattedPriReferenceValue(packageName, rawPriReferenceValue);
-
- // Assert
- Assert.IsTrue(result == expectedFormat,
- $"Expected Pri reference format: {expectedFormat}{Environment.NewLine} " +
- $"Actual: {result}{Environment.NewLine}");
- }
- }
-}
diff --git a/Flow.Launcher.Test/QueryBuilderTest.cs b/Flow.Launcher.Test/QueryBuilderTest.cs
index 6090ecc65..45ff8fc9e 100644
--- a/Flow.Launcher.Test/QueryBuilderTest.cs
+++ b/Flow.Launcher.Test/QueryBuilderTest.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Test
Query q = QueryBuilder.Build("> file.txt file2 file3", nonGlobalPlugins);
- Assert.AreEqual("file.txt file2 file3", q.Search);
+ Assert.AreEqual("file.txt file2 file3", q.Search);
Assert.AreEqual(">", q.ActionKeyword);
}
@@ -31,7 +31,7 @@ namespace Flow.Launcher.Test
Query q = QueryBuilder.Build("> file.txt file2 file3", nonGlobalPlugins);
- Assert.AreEqual("> file.txt file2 file3", q.Search);
+ Assert.AreEqual("> file.txt file2 file3", q.Search);
}
[Test]
diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln
index b8deae553..1d403c5a1 100644
--- a/Flow.Launcher.sln
+++ b/Flow.Launcher.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29806.167
+# Visual Studio Version 17
+VisualStudioVersion = 17.3.32901.215
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Test", "Flow.Launcher.Test\Flow.Launcher.Test.csproj", "{FF742965-9A80-41A5-B042-D6C7D3A21708}"
ProjectSection(ProjectDependencies) = postProject
@@ -43,6 +43,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Url",
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FFD651C7-0546-441F-BC8C-D4EE8FD01EA7}"
ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
.gitattributes = .gitattributes
.gitignore = .gitignore
appveyor.yml = appveyor.yml
@@ -79,7 +80,7 @@ Global
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.ActiveCfg = Debug|Any CPU
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.Build.0 = Debug|Any CPU
{FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x86.ActiveCfg = Debug|Any CPU
diff --git a/Flow.Launcher/ActionKeywords.xaml b/Flow.Launcher/ActionKeywords.xaml
index e94aac9f6..740b0d402 100644
--- a/Flow.Launcher/ActionKeywords.xaml
+++ b/Flow.Launcher/ActionKeywords.xaml
@@ -58,7 +58,6 @@
0 ? newActionKeyword : "*";
+
if (!PluginViewModel.IsActionKeywordRegistered(newActionKeyword))
{
pluginViewModel.ChangeActionKeyword(newActionKeyword, oldActionKeyword);
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 4ebff16a9..1d398276d 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -1,11 +1,13 @@
-using System;
+using System;
using System.Diagnostics;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using Flow.Launcher.Core;
using Flow.Launcher.Core.Configuration;
+using Flow.Launcher.Core.ExternalPlugins.Environments;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
@@ -61,6 +63,8 @@ namespace Flow.Launcher
_settingsVM = new SettingWindowViewModel(_updater, _portable);
_settings = _settingsVM.Settings;
+ AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings);
+
_alphabet.Initialize(_settings);
_stringMatcher = new StringMatcher(_alphabet);
StringMatcher.Instance = _stringMatcher;
@@ -74,21 +78,21 @@ namespace Flow.Launcher
Http.API = API;
Http.Proxy = _settings.Proxy;
- await PluginManager.InitializePlugins(API);
+ await PluginManager.InitializePluginsAsync(API);
var window = new MainWindow(_settings, _mainVM);
Log.Info($"|App.OnStartup|Dependencies Info:{ErrorReporting.DependenciesInfo()}");
Current.MainWindow = window;
Current.MainWindow.Title = Constant.FlowLauncher;
-
+
HotKeyMapper.Initialize(_mainVM);
- // happlebao todo temp fix for instance code logic
+ // todo temp fix for instance code logic
// load plugin before change language, because plugin language also needs be changed
InternationalizationManager.Instance.Settings = _settings;
InternationalizationManager.Instance.ChangeLanguage(_settings.Language);
- // main windows needs initialized before theme change because of blur settigns
+ // main windows needs initialized before theme change because of blur settings
ThemeManager.Instance.Settings = _settings;
ThemeManager.Instance.ChangeTheme(_settings.Theme);
@@ -104,14 +108,22 @@ namespace Flow.Launcher
});
}
-
private void AutoStartup()
{
- if (_settings.StartFlowLauncherOnSystemStartup)
+ // we try to enable auto-startup on first launch, or reenable if it was removed
+ // but the user still has the setting set
+ if (_settings.StartFlowLauncherOnSystemStartup && !Helper.AutoStartup.IsEnabled)
{
- if (!SettingWindow.StartupSet())
+ try
{
- SettingWindow.SetStartup();
+ Helper.AutoStartup.Enable();
+ }
+ catch (Exception e)
+ {
+ // but if it fails (permissions, etc) then don't keep retrying
+ // this also gives the user a visual indication in the Settings widget
+ _settings.StartFlowLauncherOnSystemStartup = false;
+ Notification.Show(InternationalizationManager.Instance.GetTranslation("setAutoStartFailed"), e.Message);
}
}
}
@@ -119,20 +131,17 @@ namespace Flow.Launcher
//[Conditional("RELEASE")]
private void AutoUpdates()
{
- Task.Run(async () =>
+ _ = Task.Run(async () =>
{
if (_settings.AutoUpdates)
{
- // check udpate every 5 hours
- var timer = new Timer(1000 * 60 * 60 * 5);
- timer.Elapsed += async (s, e) =>
- {
- await _updater.UpdateAppAsync(API);
- };
- timer.Start();
-
- // check updates on startup
+ // check update every 5 hours
+ var timer = new PeriodicTimer(TimeSpan.FromHours(5));
await _updater.UpdateAppAsync(API);
+
+ while (await timer.WaitForNextTickAsync())
+ // check updates on startup
+ await _updater.UpdateAppAsync(API);
}
});
}
@@ -175,7 +184,7 @@ namespace Flow.Launcher
public void OnSecondAppStarted()
{
- Current.MainWindow.Show();
+ _mainVM.Show();
}
}
}
diff --git a/Flow.Launcher/Converters/BoolToIMEConversionModeConverter.cs b/Flow.Launcher/Converters/BoolToIMEConversionModeConverter.cs
new file mode 100644
index 000000000..0bff23fe1
--- /dev/null
+++ b/Flow.Launcher/Converters/BoolToIMEConversionModeConverter.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using System.Windows.Input;
+
+namespace Flow.Launcher.Converters
+{
+ internal class BoolToIMEConversionModeConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool v)
+ {
+ if (v)
+ {
+ return ImeConversionModeValues.Alphanumeric;
+ }
+ else
+ {
+ return ImeConversionModeValues.DoNotCare;
+ }
+ }
+ return ImeConversionModeValues.DoNotCare;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ internal class BoolToIMEStateConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool v)
+ {
+ if (v)
+ {
+ return InputMethodState.Off;
+ }
+ else
+ {
+ return InputMethodState.DoNotCare;
+ }
+ }
+ return InputMethodState.DoNotCare;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Flow.Launcher/Converters/BoolToVisibilityConverter.cs b/Flow.Launcher/Converters/BoolToVisibilityConverter.cs
new file mode 100644
index 000000000..ad474d693
--- /dev/null
+++ b/Flow.Launcher/Converters/BoolToVisibilityConverter.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Converters
+{
+ public class BoolToVisibilityConverter : IValueConverter
+ {
+ public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
+ {
+ if (parameter != null)
+ {
+ if (value is true)
+ {
+ return Visibility.Collapsed;
+ }
+
+ else
+ {
+ return Visibility.Visible;
+ }
+ }
+ else {
+ if (value is true)
+ {
+ return Visibility.Visible;
+ }
+
+ else {
+ return Visibility.Collapsed;
+ }
+ }
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs b/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs
new file mode 100644
index 000000000..3c46fd01a
--- /dev/null
+++ b/Flow.Launcher/Converters/DateTimeFormatToNowConverter.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Converters
+{
+ public class DateTimeFormatToNowConverter : IValueConverter
+ {
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return value is not string format ? null : DateTime.Now.ToString(format);
+ }
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Flow.Launcher/Converters/DiameterToCenterPointConverter.cs b/Flow.Launcher/Converters/DiameterToCenterPointConverter.cs
new file mode 100644
index 000000000..e81bb2507
--- /dev/null
+++ b/Flow.Launcher/Converters/DiameterToCenterPointConverter.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Converters
+{
+ public class DiameterToCenterPointConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is double d)
+ {
+ return new Point(d / 2, d / 2);
+ }
+
+ return new Point(0, 0);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+ }
+}
diff --git a/Flow.Launcher/Converters/IconRadiusConverter.cs b/Flow.Launcher/Converters/IconRadiusConverter.cs
new file mode 100644
index 000000000..51129cfb8
--- /dev/null
+++ b/Flow.Launcher/Converters/IconRadiusConverter.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using Windows.Devices.PointOfService;
+
+namespace Flow.Launcher.Converters
+{
+ public class IconRadiusConverter : IMultiValueConverter
+ {
+ public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (values.Length != 2)
+ throw new ArgumentException("IconRadiusConverter must have 2 parameters");
+
+ return values[1] switch
+ {
+ true => (double)values[0] / 2,
+ false => (double)values[0],
+ _ => throw new ArgumentException("The second argument should be boolean", nameof(values))
+ };
+ }
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+ }
+}
diff --git a/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs b/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
index e82fa959c..7586d1fcf 100644
--- a/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
+++ b/Flow.Launcher/Converters/OpenResultHotkeyVisibilityConverter.cs
@@ -11,17 +11,17 @@ namespace Flow.Launcher.Converters
[ValueConversion(typeof(bool), typeof(Visibility))]
public class OpenResultHotkeyVisibilityConverter : IValueConverter
{
- private const int MaxVisibleHotkeys = 9;
+ private const int MaxVisibleHotkeys = 10;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- var hotkeyNumber = int.MaxValue;
+ var number = int.MaxValue;
if (value is ListBoxItem listBoxItem
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
- hotkeyNumber = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
- return hotkeyNumber <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
+ return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
diff --git a/Flow.Launcher/Converters/OrdinalConverter.cs b/Flow.Launcher/Converters/OrdinalConverter.cs
index f9fa220e3..02b9bdbde 100644
--- a/Flow.Launcher/Converters/OrdinalConverter.cs
+++ b/Flow.Launcher/Converters/OrdinalConverter.cs
@@ -1,4 +1,4 @@
-using System.Globalization;
+using System.Globalization;
using System.Windows.Controls;
using System.Windows.Data;
@@ -10,7 +10,10 @@ namespace Flow.Launcher.Converters
{
if (value is ListBoxItem listBoxItem
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
- return listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ {
+ var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
+ return res == 10 ? 0 : res; // 10th item => HOTKEY+0
+ }
return 0;
}
diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
index ecdfc5851..1e39473e0 100644
--- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
+++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
@@ -52,7 +52,8 @@ namespace Flow.Launcher.Converters
// Check if Text will be larger then our QueryTextBox
System.Windows.Media.Typeface typeface = new Typeface(QueryTextBox.FontFamily, QueryTextBox.FontStyle, QueryTextBox.FontWeight, QueryTextBox.FontStretch);
- System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black);
+ // TODO: Obsolete warning?
+ System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black);
var offset = QueryTextBox.Padding.Right;
@@ -75,4 +76,4 @@ namespace Flow.Launcher.Converters
throw new NotImplementedException();
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/Converters/StringToKeyBindingConverter.cs b/Flow.Launcher/Converters/StringToKeyBindingConverter.cs
new file mode 100644
index 000000000..3675f06fc
--- /dev/null
+++ b/Flow.Launcher/Converters/StringToKeyBindingConverter.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using System.Windows.Input;
+
+namespace Flow.Launcher.Converters
+{
+ class StringToKeyBindingConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var mode = parameter as string;
+ var hotkeyStr = value as string;
+ var converter = new KeyGestureConverter();
+ var key = (KeyGesture)converter.ConvertFromString(hotkeyStr);
+ if (mode == "key")
+ {
+ return key.Key;
+ }
+ else if (mode == "modifiers")
+ {
+ return key.Modifiers;
+ }
+ return null;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Flow.Launcher/Converters/TextConverter.cs b/Flow.Launcher/Converters/TextConverter.cs
new file mode 100644
index 000000000..90d445776
--- /dev/null
+++ b/Flow.Launcher/Converters/TextConverter.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.ViewModel;
+
+namespace Flow.Launcher.Converters
+{
+ public class TextConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var ID = value.ToString();
+ switch(ID)
+ {
+ case PluginStoreItemViewModel.NewRelease:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_NewRelease");
+ case PluginStoreItemViewModel.RecentlyUpdated:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_RecentlyUpdated");
+ case PluginStoreItemViewModel.None:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_None");
+ case PluginStoreItemViewModel.Installed:
+ return InternationalizationManager.Instance.GetTranslation("pluginStore_Installed");
+ default:
+ return ID;
+ }
+
+ }
+
+ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
+ }
+}
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml
index 187f99d18..1113cb24d 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml
@@ -64,7 +64,6 @@
+
-
+
@@ -132,6 +135,7 @@
LastChildFill="True">
+ Text="{DynamicResource flowlauncherPressHotkey}"
+ Visibility="Visible" />
@@ -49,8 +48,9 @@
Margin="0,0,18,0"
VerticalContentAlignment="Center"
input:InputMethod.IsInputMethodEnabled="False"
+ GotFocus="tbHotkey_GotFocus"
+ LostFocus="tbHotkey_LostFocus"
PreviewKeyDown="TbHotkey_OnPreviewKeyDown"
- TabIndex="100"
- LostFocus="tbHotkey_LostFocus"/>
+ TabIndex="100" />
\ No newline at end of file
diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs
index bc437d862..3da66caeb 100644
--- a/Flow.Launcher/HotkeyControl.xaml.cs
+++ b/Flow.Launcher/HotkeyControl.xaml.cs
@@ -14,22 +14,21 @@ namespace Flow.Launcher
{
public partial class HotkeyControl : UserControl
{
- private Brush tbMsgForegroundColorOriginal;
-
- private string tbMsgTextOriginal;
-
public HotkeyModel CurrentHotkey { get; private set; }
public bool CurrentHotkeyAvailable { get; private set; }
public event EventHandler HotkeyChanged;
+ ///
+ /// Designed for Preview Hotkey and KeyGesture.
+ ///
+ public bool ValidateKeyGesture { get; set; } = false;
+
protected virtual void OnHotkeyChanged() => HotkeyChanged?.Invoke(this, EventArgs.Empty);
public HotkeyControl()
{
InitializeComponent();
- tbMsgTextOriginal = tbMsg.Text;
- tbMsgForegroundColorOriginal = tbMsg.Foreground;
}
private CancellationTokenSource hotkeyUpdateSource;
@@ -54,9 +53,7 @@ namespace Flow.Launcher
specialKeyState.CtrlPressed,
key);
- var hotkeyString = hotkeyModel.ToString();
-
- if (hotkeyString == tbHotkey.Text)
+ if (hotkeyModel.Equals(CurrentHotkey))
{
return;
}
@@ -65,55 +62,80 @@ namespace Flow.Launcher
{
await Task.Delay(500, token);
if (!token.IsCancellationRequested)
- await SetHotkey(hotkeyModel);
+ await SetHotkeyAsync(hotkeyModel);
});
}
- public async Task SetHotkey(HotkeyModel keyModel, bool triggerValidate = true)
+ public async Task SetHotkeyAsync(HotkeyModel keyModel, bool triggerValidate = true)
{
- CurrentHotkey = keyModel;
-
- tbHotkey.Text = CurrentHotkey.ToString();
+ tbHotkey.Text = keyModel.ToString();
tbHotkey.Select(tbHotkey.Text.Length, 0);
if (triggerValidate)
{
- CurrentHotkeyAvailable = CheckHotkeyAvailability();
- if (!CurrentHotkeyAvailable)
- {
- tbMsg.Foreground = new SolidColorBrush(Colors.Red);
- tbMsg.Text = InternationalizationManager.Instance.GetTranslation("hotkeyUnavailable");
- }
- else
- {
- tbMsg.Foreground = new SolidColorBrush(Colors.Green);
- tbMsg.Text = InternationalizationManager.Instance.GetTranslation("success");
- }
- tbMsg.Visibility = Visibility.Visible;
+ bool hotkeyAvailable = CheckHotkeyAvailability(keyModel, ValidateKeyGesture);
+ CurrentHotkeyAvailable = hotkeyAvailable;
+ SetMessage(hotkeyAvailable);
OnHotkeyChanged();
var token = hotkeyUpdateSource.Token;
await Task.Delay(500, token);
if (token.IsCancellationRequested)
return;
- FocusManager.SetFocusedElement(FocusManager.GetFocusScope(this), null);
- Keyboard.ClearFocus();
+
+ if (CurrentHotkeyAvailable)
+ {
+ CurrentHotkey = keyModel;
+ // To trigger LostFocus
+ FocusManager.SetFocusedElement(FocusManager.GetFocusScope(this), null);
+ Keyboard.ClearFocus();
+ }
+ }
+ else
+ {
+ CurrentHotkey = keyModel;
}
}
-
- public void SetHotkey(string keyStr, bool triggerValidate = true)
+
+ public Task SetHotkeyAsync(string keyStr, bool triggerValidate = true)
{
- SetHotkey(new HotkeyModel(keyStr), triggerValidate);
+ return SetHotkeyAsync(new HotkeyModel(keyStr), triggerValidate);
}
- private bool CheckHotkeyAvailability() => HotKeyMapper.CheckAvailability(CurrentHotkey);
+ private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) => hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
public new bool IsFocused => tbHotkey.IsFocused;
private void tbHotkey_LostFocus(object sender, RoutedEventArgs e)
{
- tbMsg.Text = tbMsgTextOriginal;
- tbMsg.Foreground = tbMsgForegroundColorOriginal;
+ tbHotkey.Text = CurrentHotkey?.ToString() ?? "";
+ tbHotkey.Select(tbHotkey.Text.Length, 0);
+ }
+
+ private void tbHotkey_GotFocus(object sender, RoutedEventArgs e)
+ {
+ ResetMessage();
+ }
+
+ private void ResetMessage()
+ {
+ tbMsg.Text = InternationalizationManager.Instance.GetTranslation("flowlauncherPressHotkey");
+ tbMsg.SetResourceReference(TextBox.ForegroundProperty, "Color05B");
+ }
+
+ private void SetMessage(bool hotkeyAvailable)
+ {
+ if (!hotkeyAvailable)
+ {
+ tbMsg.Foreground = new SolidColorBrush(Colors.Red);
+ tbMsg.Text = InternationalizationManager.Instance.GetTranslation("hotkeyUnavailable");
+ }
+ else
+ {
+ tbMsg.Foreground = new SolidColorBrush(Colors.Green);
+ tbMsg.Text = InternationalizationManager.Instance.GetTranslation("success");
+ }
+ tbMsg.Visibility = Visibility.Visible;
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/Images/Browser.png b/Flow.Launcher/Images/Browser.png
index 5d475f82e..a5bc848c7 100644
Binary files a/Flow.Launcher/Images/Browser.png and b/Flow.Launcher/Images/Browser.png differ
diff --git a/Flow.Launcher/Images/app_missing_img.png b/Flow.Launcher/Images/app_missing_img.png
index b86c29ac9..0bb16e5d8 100644
Binary files a/Flow.Launcher/Images/app_missing_img.png and b/Flow.Launcher/Images/app_missing_img.png differ
diff --git a/Flow.Launcher/Images/illustration_01.png b/Flow.Launcher/Images/illustration_01.png
new file mode 100644
index 000000000..aaeab3d35
Binary files /dev/null and b/Flow.Launcher/Images/illustration_01.png differ
diff --git a/Flow.Launcher/Images/illustration_02.png b/Flow.Launcher/Images/illustration_02.png
new file mode 100644
index 000000000..dd210f99a
Binary files /dev/null and b/Flow.Launcher/Images/illustration_02.png differ
diff --git a/Flow.Launcher/Images/loading.png b/Flow.Launcher/Images/loading.png
new file mode 100644
index 000000000..1600b5967
Binary files /dev/null and b/Flow.Launcher/Images/loading.png differ
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 9a6e6ebf4..3832562d6 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -1,133 +1,367 @@
-
-
- Kunne ikke registrere genvejstast: {0}
- Kunne ikke starte {0}
- Ugyldigt Flow Launcher plugin filformat
- Sæt øverst i denne søgning
- Annuller øverst i denne søgning
- Udfør søgning: {0}
- Seneste afviklingstid: {0}
- Åben
- Indstillinger
- Om
- Afslut
-
-
- Flow Launcher indstillinger
- Generelt
- Start Flow Launcher ved system start
- Skjul Flow Launcher ved mistet fokus
- Vis ikke notifikationer om nye versioner
- Husk seneste position
- Sprog
- Maksimum antal resultater vist
- Ignorer genvejstaster i fuldskærmsmode
- Python bibliotek
- Autoopdatering
- Vælg
- Skjul Flow Launcher ved opstart
-
-
- Plugin
- Find flere plugins
- Deaktiver
- Nøgleord
- Plugin bibliotek
- Forfatter
- Initaliseringstid:
- Søgetid:
-
-
- Tema
- Søg efter flere temaer
- Søgefelt skrifttype
- Resultat skrifttype
- Vindue mode
- Gennemsigtighed
-
-
- Genvejstast
- Flow Launcher genvejstast
- Åbn resultatmodifikatorer
- Tilpasset søgegenvejstast
- Vis hotkey
- Slet
- Rediger
- Tilføj
- Vælg venligst
- Er du sikker på du vil slette {0} plugin genvejstast?
-
-
- HTTP Proxy
- Aktiver HTTP Proxy
- HTTP Server
- Port
- Brugernavn
- Adgangskode
- Test Proxy
- Gem
- Server felt må ikke være tomt
- Port felt må ikke være tomt
- Ugyldigt port format
- Proxy konfiguration gemt
- Proxy konfiguret korrekt
- Proxy forbindelse fejlet
-
-
- Om
- Website
- Version
- Du har aktiveret Flow Launcher {0} gange
- Tjek for opdateringer
- Ny version {0} er tilgængelig, genstart venligst Flow Launcher
- Release Notes:
-
-
- Gammelt nøgleord
- Nyt nøgleord
- Annuller
- Færdig
- Kan ikke finde det valgte plugin
- Nyt nøgleord må ikke være tomt
- Nyt nøgleord er tilknyttet et andet plugin, tilknyt venligst et andet nyt nøgeleord
- Fortsæt
- Brug * hvis du ikke vil angive et nøgleord
-
-
- Vis
- Genvejstast er utilgængelig, vælg venligst en ny genvejstast
- Ugyldig plugin genvejstast
- Opdater
-
-
- Genvejstast utilgængelig
-
-
- Version
- Tid
- Beskriv venligst hvordan Flow Launcher crashede, så vi kan rette det.
- Send rapport
- Annuller
- Generelt
- Exceptions
- Exception Type
- Kilde
- Stack Trace
- Sender
- Rapport sendt korrekt
- Kunne ikke sende rapport
- Flow Launcher fik en fejl
-
-
- Ny Flow Launcher udgivelse {0} er nu tilgængelig
- Der skete en fejl ifm. opdatering af Flow Launcher
- Opdater
- Annuler
- Denne opdatering vil genstarte Flow Launcher
- Følgende filer bliver opdateret
- Opdatereringsfiler
- Opdateringsbeskrivelse
-
-
+
+
+
+ Kunne ikke registrere genvejstast: {0}
+ Kunne ikke starte {0}
+ Ugyldigt Flow Launcher plugin filformat
+ Sæt øverst i denne søgning
+ Annuller øverst i denne søgning
+ Udfør søgning: {0}
+ Seneste afviklingstid: {0}
+ Åben
+ Indstillinger
+ Om
+ Afslut
+ Close
+ Copy
+ Cut
+ Paste
+ Undo
+ Select All
+ File
+ Folder
+ Text
+ Game Mode
+ Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
+
+
+ Indstillinger
+ Generelt
+ Portable Mode
+ Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Start Flow Launcher ved system start
+ Error setting launch on startup
+ Skjul Flow Launcher ved mistet fokus
+ Vis ikke notifikationer om nye versioner
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Sprog
+ Last Query Style
+ Show/Hide previous results when Flow Launcher is reactivated.
+ Preserve Last Query
+ Select last Query
+ Empty last Query
+ Maksimum antal resultater vist
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignorer genvejstaster i fuldskærmsmode
+ Disable Flow Launcher activation when a full screen application is active (Recommended for games).
+ Default File Manager
+ Select the file manager to use when opening the folder.
+ Default Web Browser
+ Setting for New Tab, New Window, Private Mode.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Autoopdatering
+ Vælg
+ Skjul Flow Launcher ved opstart
+ Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Find flere plugins
+ On
+ Deaktiver
+ Action keyword Setting
+ Nøgleord
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Current Priority
+ New Priority
+ Priority
+ Change Plugin Results Priority
+ Plugin bibliotek
+ af
+ Initaliseringstid:
+ Søgetid:
+ Version
+ Website
+ Uninstall
+
+
+
+ Plugin Store
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Refresh
+ Install
+ Uninstall
+ Opdater
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Tema
+ Appearance
+ Søg efter flere temaer
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Søgefelt skrifttype
+ Resultat skrifttype
+ Vindue mode
+ Gennemsigtighed
+ Theme {0} not exists, fallback to default theme
+ Fail to load theme {0}, fallback to default theme
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Animation
+ Use Animation in UI
+ Clock
+ Date
+
+
+ Genvejstast
+ Genvejstast
+ Flow Launcher genvejstast
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Åbn resultatmodifikatorer
+ Select a modifier key to open selected result via keyboard.
+ Vis hotkey
+ Show result selection hotkey with results.
+ Tilpasset søgegenvejstast
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Slet
+ Rediger
+ Tilføj
+ Vælg venligst
+ Er du sikker på du vil slette {0} plugin genvejstast?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP Proxy
+ Aktiver HTTP Proxy
+ HTTP Server
+ Port
+ Brugernavn
+ Adgangskode
+ Test Proxy
+ Gem
+ Server felt må ikke være tomt
+ Port felt må ikke være tomt
+ Ugyldigt port format
+ Proxy konfiguration gemt
+ Proxy konfiguret korrekt
+ Proxy forbindelse fejlet
+
+
+ Om
+ Website
+ GitHub
+ Docs
+ Version
+ Icons
+ Du har aktiveret Flow Launcher {0} gange
+ Tjek for opdateringer
+ Become A Sponsor
+ Ny version {0} er tilgængelig, genstart venligst Flow Launcher
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Release Notes
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Gammelt nøgleord
+ Nyt nøgleord
+ Annuller
+ Færdig
+ Kan ikke finde det valgte plugin
+ Nyt nøgleord må ikke være tomt
+ Nyt nøgleord er tilknyttet et andet plugin, tilknyt venligst et andet nyt nøgeleord
+ Fortsæt
+ Completed successfully
+ Brug * hvis du ikke vil angive et nøgleord
+
+
+ Tilpasset søgegenvejstast
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Vis
+ Genvejstast er utilgængelig, vælg venligst en ny genvejstast
+ Ugyldig plugin genvejstast
+ Opdater
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Genvejstast utilgængelig
+
+
+ Version
+ Tid
+ Beskriv venligst hvordan Flow Launcher crashede, så vi kan rette det.
+ Send rapport
+ Annuller
+ Generelt
+ Exceptions
+ Exception Type
+ Kilde
+ Stack Trace
+ Sender
+ Rapport sendt korrekt
+ Kunne ikke sende rapport
+ Flow Launcher fik en fejl
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Ny Flow Launcher udgivelse {0} er nu tilgængelig
+ Der skete en fejl ifm. opdatering af Flow Launcher
+ Opdater
+ Annuller
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Denne opdatering vil genstarte Flow Launcher
+ Følgende filer bliver opdateret
+ Opdatereringsfiler
+ Opdateringsbeskrivelse
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 9572db8cb..dd024a4ac 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -1,133 +1,367 @@
-
-
- Tastenkombinationregistrierung: {0} fehlgeschlagen
- Kann {0} nicht starten
- Fehlerhaftes Flow Launcher-Plugin Dateiformat
- In dieser Abfrage als oberstes setzen
- In dieser Abfrage oberstes abbrechen
- Abfrage ausführen:{0}
- Letzte Ausführungszeit:{0}
- Öffnen
- Einstellungen
- Über
- Schließen
-
-
- Flow Launcher Einstellungen
- Allgemein
- Starte Flow Launcher bei Systemstart
- Verstecke Flow Launcher wenn der Fokus verloren geht
- Zeige keine Nachricht wenn eine neue Version vorhanden ist
- Merke letzte Ausführungsposition
- Sprache
- Maximale Anzahl Ergebnissen
- Ignoriere Tastenkombination wenn Fenster im Vollbildmodus ist
- Python-Verzeichnis
- Automatische Aktualisierung
- Auswählen
- Verstecke Flow Launcher bei Systemstart
-
-
- Plugin
- Suche nach weiteren Plugins
- Deaktivieren
- Aktionsschlüsselwörter
- Pluginordner
- Autor
- Initialisierungszeit:
- Abfragezeit:
-
-
- Theme
- Suche nach weiteren Themes
- Abfragebox Schriftart
- Ergebnis Schriftart
- Fenstermodus
- Transparenz
-
-
- Tastenkombination
- Flow Launcher Tastenkombination
- Öffnen Sie die Ergebnismodifikatoren
- Benutzerdefinierte Abfrage Tastenkombination
- Hotkey anzeigen
- Löschen
- Bearbeiten
- Hinzufügen
- Bitte einen Eintrag auswählen
- Wollen Sie die {0} Plugin Tastenkombination wirklich löschen?
-
-
- HTTP Proxy
- Aktiviere HTTP Proxy
- HTTP Server
- Port
- Benutzername
- Passwort
- Teste Proxy
- Speichern
- Server darf nicht leer sein
- Server Port darf nicht leer sein
- Falsches Port Format
- Proxy wurde erfolgreich gespeichert
- Proxy ist korrekt
- Verbindung zum Proxy fehlgeschlagen
-
-
- Über
- Webseite
- Version
- Sie haben Flow Launcher {0} mal aktiviert
- Nach Aktuallisierungen Suchen
- Eine neue Version ({0}) ist vorhanden. Bitte starten Sie Flow Launcher neu.
- Versionshinweise:
-
-
- Altes Aktionsschlüsselwort
- Neues Aktionsschlüsselwort
- Abbrechen
- Fertig
- Kann das angegebene Plugin nicht finden
- Neues Aktionsschlüsselwort darf nicht leer sein
- Aktionsschlüsselwort ist schon bei einem anderen Plugin in verwendung. Bitte stellen Sie ein anderes Aktionsschlüsselwort ein.
- Erfolgreich
- Benutzen Sie * wenn Sie ein Aktionsschlüsselwort definieren wollen.
-
-
- Vorschau
- Tastenkombination ist nicht verfügbar, bitte wähle eine andere Tastenkombination
- Ungültige Plugin Tastenkombination
- Aktualisieren
-
-
- Tastenkombination nicht verfügbar
-
-
- Version
- Zeit
- Bitte teilen Sie uns mit, wie die Anwendung abgestürzt ist, damit wir den Fehler beheben können.
- Sende Report
- Abbrechen
- Allgemein
- Fehler
- Fehlertypen
- Quelle
- Stack Trace
- Sende
- Report erfolgreich
- Report fehlgeschlagen
- Flow Launcher hat einen Fehler
-
-
- V{0} von Flow Launcher ist verfügbar
- Es ist ein Fehler während der Installation der Aktualisierung aufgetreten.
- Aktualisieren
- Abbrechen
- Diese Aktualisierung wird Flow Launcher neu starten
- Folgende Dateien werden aktualisiert
- Aktualisiere Dateien
- Aktualisierungbeschreibung
-
-
\ No newline at end of file
+
+
+
+ Tastenkombinationregistrierung: {0} fehlgeschlagen
+ Kann {0} nicht starten
+ Fehlerhaftes Flow Launcher-Plugin Dateiformat
+ In dieser Abfrage als oberstes setzen
+ In dieser Abfrage oberstes abbrechen
+ Abfrage ausführen:{0}
+ Letzte Ausführungszeit:{0}
+ Öffnen
+ Einstellungen
+ Über
+ Schließen
+ Schließen
+ Kopieren
+ Ausschneiden
+ Einfügen
+ Rückgängig
+ Alle auswählen
+ Datei
+ Ordner
+ Text
+ Spielmodus
+ Hotkeys deaktivieren.
+ Position Reset
+ Reset search window position
+
+
+ Einstellungen
+ Allgemein
+ Portabler Modus
+ Speichern Sie alle Einstellungen und Benutzerdaten in einem Ordner (nützlich bei Verwendung mit Wechseldatenträgern oder Clouddiensten).
+ Starte Flow Launcher bei Systemstart
+ Error setting launch on startup
+ Verstecke Flow Launcher wenn der Fokus verloren geht
+ Zeige keine Nachricht wenn eine neue Version vorhanden ist
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Sprache
+ Abfragestil auswählen
+ Vorherige Ergebnisse ein-/ausblenden, wenn Flow Launcher wieder aktiviert wird.
+ Letzte Abfrage beibehalten
+ Letzte Abfrage auswählen
+ Letzte Abfrage leeren
+ Maximale Anzahl Ergebnissen
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignoriere Tastenkombination wenn Fenster im Vollbildmodus ist
+ Deaktiviere Flow Launcher, wenn eine Vollbildanwendung aktiv ist (Empfohlen für Spiele).
+ Standard-Dateimanager
+ Wählen Sie den Dateimanager, der beim Öffnen des Ordners verwendet werden soll.
+ Standardbrowser
+ Einstellung für neuen Tab, neues Fenster und dem Privatmodus.
+ Python-Pfad
+ Node.js-Pfad
+ Bitte wählen Sie das Programm Node.js aus
+ Bitte wählen Sie pythonw.exe aus
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Automatische Aktualisierung
+ Auswählen
+ Verstecke Flow Launcher bei Systemstart
+ Statusleistensymbol ausblenden
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Suchgenauigkeit abfragen
+ Erforderliche Suchergebnisse.
+ Pinyin aktivieren
+ Ermöglicht die Verwendung von Pinyin für die Suche. Pinyin ist das Standardsystem der romanisierten Schreibweise für die Übersetzung von chinesischen Texten.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Der Schatteneffekt ist nicht zulässig, wenn das aktuelle Thema den Weichzeichneffekt aktiviert hat
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Erweiterung
+ Erweiterung
+ Suche nach weiteren Plugins
+ Aktivieren
+ Deaktivieren
+ Aktionswort Einstellung
+ Aktionsschlüsselwörter
+ Aktuelles Aktionswort
+ Neues Aktionswort
+ Aktionswörter ändern
+ Aktuelle Priorität
+ Neue Priorität
+ Priorität
+ Change Plugin Results Priority
+ Pluginordner
+ von
+ Initialisierungszeit:
+ Abfragezeit:
+ Version
+ Webseite
+ Deinstallieren
+
+
+
+ Erweiterungen laden
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Aktualisieren
+ Installieren
+ Deinstallieren
+ Aktualisieren
+ Plugin ist bereits installiert
+ New Version
+ Dieses Plugin wurde innerhalb der letzten 7 Tage aktualisiert
+ New Update is Available
+
+
+
+
+ Design
+ Appearance
+ Suche nach weiteren Themes
+ Wie man ein Design erstellt
+ Hallo!
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Programm
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Abfragebox Schriftart
+ Ergebnis Schriftart
+ Fenstermodus
+ Transparenz
+ Das Design {0} existiert nicht, deshalb wird das Standard-Template aktiviert
+ Laden des Designs {0} fehlgeschlagen, das Standard-Template wird aktiviert
+ Themenordner öffnen
+ Themenordner öffnen
+ Farbschema
+ Systemvorgabe
+ Hell
+ Dunkel
+ Soundeffekt
+ Ton abspielen, wenn das Suchfenster geöffnet wird
+ Animation
+ Animationen in der Oberfläche verwenden
+ Clock
+ Date
+
+
+ Tastenkombination
+ Tastenkombination
+ Flow Launcher Tastenkombination
+ Verknüpfung eingeben, um Flow Launcher anzuzeigen/auszublenden.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Öffnen Sie die Ergebnismodifikatoren
+ Select a modifier key to open selected result via keyboard.
+ Hotkey anzeigen
+ Show result selection hotkey with results.
+ Benutzerdefinierte Abfrage Tastenkombination
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Beschreibung
+ Löschen
+ Bearbeiten
+ Hinzufügen
+ Bitte einen Eintrag auswählen
+ Wollen Sie die {0} Plugin Tastenkombination wirklich löschen?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP-Proxy
+ Aktiviere HTTP Proxy
+ HTTP-Server
+ Port
+ Benutzername
+ Passwort
+ Teste Proxy
+ Speichern
+ Server darf nicht leer sein
+ Server Port darf nicht leer sein
+ Falsches Port Format
+ Proxy wurde erfolgreich gespeichert
+ Proxy ist korrekt
+ Verbindung zum Proxy fehlgeschlagen
+
+
+ Über
+ Webseite
+ GitHub
+ Dokumentation
+ Version
+ Icons
+ Sie haben Flow Launcher {0} mal aktiviert
+ Nach Aktuallisierungen Suchen
+ Become A Sponsor
+ Eine neue Version ({0}) ist vorhanden. Bitte starten Sie Flow Launcher neu.
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Versionshinweise
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ Datei-Manager
+ Profilname
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Standard-Webbrowser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser-Name
+ Browserpfad
+ New Window
+ New Tab
+ Privater Modus
+
+
+ Priorität ändern
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Altes Aktionsschlüsselwort
+ Neues Aktionsschlüsselwort
+ Abbrechen
+ Fertig
+ Kann das angegebene Plugin nicht finden
+ Neues Aktionsschlüsselwort darf nicht leer sein
+ Aktionsschlüsselwort ist schon bei einem anderen Plugin in verwendung. Bitte stellen Sie ein anderes Aktionsschlüsselwort ein.
+ Erfolgreich
+ Completed successfully
+ Benutzen Sie * wenn Sie ein Aktionsschlüsselwort definieren wollen.
+
+
+ Benutzerdefinierte Abfrage Tastenkombination
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Vorschau
+ Tastenkombination ist nicht verfügbar, bitte wähle eine andere Tastenkombination
+ Ungültige Plugin Tastenkombination
+ Aktualisieren
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Tastenkombination nicht verfügbar
+
+
+ Version
+ Zeit
+ Bitte teilen Sie uns mit, wie die Anwendung abgestürzt ist, damit wir den Fehler beheben können.
+ Sende Report
+ Abbrechen
+ Allgemein
+ Fehler
+ Fehlertypen
+ Quelle
+ Stapelüberwachung
+ Sende
+ Report erfolgreich
+ Report fehlgeschlagen
+ Flow Launcher hat einen Fehler
+
+
+ Bitte warten...
+
+
+ Nach Updates suchen!
+ Sie haben bereits die neuste Version
+ Update gefunden
+ Wird aktualisiert ...
+
+ Flow Launcher konnte deine Profildaten nicht in die neue Updateversion verschieben.
+ Bitte verschieben Sie Ihren Profildatenordner manuell von {0} nach {1}
+
+ Neues Update
+ V{0} von Flow Launcher ist verfügbar
+ Es ist ein Fehler während der Installation der Aktualisierung aufgetreten.
+ Aktualisieren
+ Abbrechen
+ Aktualisierung fehlgeschlagen
+ Überprüfen Sie Ihre Internetverbindung und aktualisieren Sie die Proxy-Einstellungen um auf github-cloud.s3.amazonaws.com zugreifen zu können.
+ Diese Aktualisierung wird Flow Launcher neu starten
+ Folgende Dateien werden aktualisiert
+ Aktualisiere Dateien
+ Aktualisierungbeschreibung
+
+
+ Überspringen
+ Willkommen im Flow Launcher
+ Hallo, dies ist das erste Mal, dass Sie den Flow Launcher verwenden!
+ Vor dem Start hilft dieser Assistent beim Einrichten des Flow Launchers. Sie können dies überspringen, wenn Sie möchten. Bitte wählen Sie eine Sprache aus
+ Suchen und starten Sie alle Dateien sowie Anwendungen auf Ihrem PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 25de530bc..103d523a7 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -18,21 +18,37 @@
Copy
Cut
Paste
+ Undo
+ Select All
File
Folder
Text
Game Mode
Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
- Flow Launcher Settings
+ Settings
General
Portable Mode
Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
Start Flow Launcher on system startup
+ Error setting launch on startup
Hide Flow Launcher when focus is lost
Do not show new version notifications
- Remember last launch location
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
Language
Last Query Style
Show/Hide previous results when Flow Launcher is reactivated.
@@ -40,25 +56,39 @@
Select last Query
Empty last Query
Maximum results shown
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
Ignore hotkeys in fullscreen mode
Disable Flow Launcher activation when a full screen application is active (Recommended for games).
Default File Manager
Select the file manager to use when opening the folder.
Default Web Browser
Setting for New Tab, New Window, Private Mode.
- Python Directory
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
Auto Update
- Select
+ Select
Hide Flow Launcher on startup
Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
Query Search Precision
Changes minimum match score required for results.
- Should Use Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
Shadow effect is not allowed while current theme has blur effect enabled
- Plugins
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
Find more plugins
On
Off
@@ -70,24 +100,47 @@
Current Priority
New Priority
Priority
+ Change Plugin Results Priority
Plugin Directory
by
Init time:
Query time:
- | Version
+ Version
Website
+ Uninstall
Plugin Store
+ New Release
+ Recently Updated
+ Plugins
+ Installed
Refresh
- Install
+ Install
+ Uninstall
+ Update
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
Theme
+ Appearance
Theme Gallery
How to create a theme
Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
Query Box Font
Result Item Font
Window Mode
@@ -104,27 +157,42 @@
Play a small sound when the search window opens
Animation
Use Animation in UI
+ Clock
+ Date
Hotkey
+ Hotkeys
Flow Launcher Hotkey
Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
Open Result Modifier Key
Select a modifier key to open selected result via keyboard.
Show Hotkey
Show result selection hotkey with results.
- Custom Query Hotkey
+ Custom Query Hotkeys
+ Custom Query Shortcuts
+ Built-in Shortcuts
Query
+ Shortcut
+ Expansion
+ Description
Delete
Edit
Add
Please select an item
Are you sure you want to delete {0} plugin hotkey?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
Query window shadow effect
Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
Use Segoe Fluent Icons
Use Segoe Fluent Icons for query results where supported
+ Press Key
HTTP Proxy
@@ -145,11 +213,13 @@
About
Website
- Github
+ GitHub
Docs
Version
+ Icons
You have activated Flow Launcher {0} times
Check for Updates
+ Become A Sponsor
New version {0} is available, would you like to restart Flow Launcher to use the update?
Check updates failed, please check your connection and proxy settings to api.github.com.
@@ -161,6 +231,8 @@
DevTools
Setting Folder
Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
Wizard
@@ -202,12 +274,18 @@
Custom Query Hotkey
- Press the custom hotkey to automatically insert the specified query.
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
Preview
Hotkey is unavailable, please select a new hotkey
Invalid plugin hotkey
Update
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
Hotkey Unavailable
@@ -230,7 +308,7 @@
Please wait...
-
+
Checking for new update
You already have the latest Flow Launcher version
Update found
@@ -270,8 +348,8 @@
Back / Context Menu
Item Navigation
Open Context Menu
- Open Contaning Folder
- Run as Admin
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
Query History
Back to Result in Context Menu
Autocomplete
@@ -283,7 +361,7 @@
Weather in Google Result
> ping 8.8.8.8
Shell Command
- Bluetooth
+ s Bluetooth
Bluetooth in Windows Settings
sn
Sticky Notes
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
new file mode 100644
index 000000000..430aa5e4c
--- /dev/null
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -0,0 +1,367 @@
+
+
+
+ Error al registrar la tecla de acceso directo: {0}
+ No se pudo iniciar {0}
+ Formato de archivo de plugin Flow Launcher inválido
+ Establecer como superior en esta consulta
+ Quitar como superior en esta consulta
+ Ejecutar consulta: {0}
+ Fecha de última ejecución: {0}
+ Abrir
+ Ajustes
+ Acerca de
+ Salir
+ Cerrar
+ Copiar
+ Cortar
+ Pegar
+ Undo
+ Select All
+ Archivo
+ Carpeta
+ Texto
+ Modo de juego
+ Suspender el uso de las teclas de acceso directo.
+ Position Reset
+ Reset search window position
+
+
+ Ajustes
+ General
+ Modo portable
+ Almacena todos los ajustes y datos de usuario en una sola carpeta (útil cuando se utiliza con unidades extraíbles o servicios en la nube).
+ Iniciar Flow Launcher al arrancar el sistema
+ Error setting launch on startup
+ Ocultar Flow Launcher cuando se pierde el enfoque
+ No mostrar notificaciones de nuevas versiones
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Idioma
+ Estilo de la última consulta
+ Mostrar/Ocultar resultados anteriores cuando Flow Launcher es reactivado.
+ Conservar última consulta
+ Seleccionar última consulta
+ Borrar última consulta
+ Máximo de resultados mostrados
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignorar atajos de teclado en modo pantalla completa
+ Deshabilitar Flow Launcher cuando una aplicación de pantalla completa está activa (Recomendado para juegos).
+ Gestor de archivos predeterminado
+ Seleccione el gestor de archivos a utilizar al abrir la carpeta.
+ Navegador web predeterminado
+ Configuración para Nueva Pestaña, Nueva Ventana, Modo Privado.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Actualización automática
+ Seleccionar
+ Ocultar Flow Launcher al arrancar el sistema
+ Ocultar icono de la bandeja
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Precisión de la búsqueda
+ Cambia la puntuación mínima de similitud requerida para resultados.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque habilitado
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Encontrar más plugins
+ Activado
+ Desactivado
+ Ajuste de palabra clave
+ Palabra clave
+ Palabra clave actual
+ Nueva palabra clave
+ Cambiar palabras clave
+ Prioridad Actual
+ Nueva Prioridad
+ Prioridad
+ Cambiar la prioridad del resultado del plugin
+ Directorio de Plugins
+ por
+ Tiempo de inicio:
+ Tiempo de consulta:
+ Versión
+ Sitio web
+ Uninstall
+
+
+
+ Tienda de Plugins
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Recargar
+ Instalar
+ Uninstall
+ Update
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Tema
+ Appearance
+ Galería de Temas
+ Cómo crear un tema
+ Hola
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Fuente del cuadro de consulta
+ Fuente de los resultados
+ Modo Ventana
+ Opacidad
+ Tema {0} no existe, se usará al tema predeterminado
+ Error al cargar el tema {0}, se usará al tema predeterminado
+ Carpeta de Temas
+ Abrir Carpeta de Temas
+ Esquemas de Colores
+ Determinado por el Sistema
+ Claro
+ Oscuro
+ Efectos de Sonido
+ Reproducir un sonido al abrir la ventana de búsqueda
+ Animación
+ Usar Animación en la Interfaz
+ Clock
+ Date
+
+
+ Tecla Rápida
+ Tecla Rápida
+ Tecla de acceso a Flow Launcher
+ Introduzca el acceso directo para mostrar/ocultar Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Abrir Tecla de Modificación de Resultado
+ Seleccione una tecla de modificación para abrir el resultado seleccionado vía teclado.
+ Mostrar tecla de acceso directo
+ Mostrar tecla rápida de selección con resultados.
+ Tecla Rápida de Consulta Personalizada
+ Custom Query Shortcut
+ Built-in Shortcut
+ Consulta
+ Shortcut
+ Expansion
+ Description
+ Eliminar
+ Editar
+ Añadir
+ Por favor, seleccione un elemento
+ ¿Está seguro que desea eliminar la tecla de acceso directo del plugin {0}?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Efecto de sombra de ventana de búsqueda
+ El efecto sombra tiene un uso sustancial de GPU. No se recomienda si el rendimiento de su computadora es limitado.
+ Tamaño de Ancho de Ventana
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Usar Iconos de Segoe Fluent
+ Usar iconos de Segoe Fluent para resultados de consultas que sean soportados
+ Press Key
+
+
+ Proxy HTTP
+ Habilitar Proxy HTTP
+ Servidor HTTP
+ Puerto
+ Nombre de Usuario
+ Contraseña
+ Probar Proxy
+ Guardar
+ El campo del servidor no puede estar vacío
+ El campo de puerto no puede estar vacío
+ Formato de puerto inválido
+ Configuración de proxy guardada correctamente
+ Proxy configurado correctamente
+ Conexión con proxy fallida
+
+
+ Acerca de
+ Sitio web
+ GitHub
+ Documentación
+ Versión
+ Icons
+ Has activado Flow Launcher {0} veces
+ Buscar actualizaciones
+ Become A Sponsor
+ La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para usar la actualización?
+ Falló la comprobación de actualizaciones, compruebe su conexión y configuración de proxy a api.github.com.
+
+ Falló la descarga de actualizaciones, por favor compruebe su conexión y configuración de proxy agithub-cloud.s3.amazonaws.com,
+ o vaya a https://github.com/Flow-Launcher/Flow.Launcher/releases para descargar actualizaciones manualmente.
+
+ Notas de la versión
+ Consejos de Uso
+ Herramientas de desarrollo
+ Carpeta de Configuración
+ Carpeta de registros
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Asistente
+
+
+ Seleccionar Gestor de Archivos
+ Por favor, especifique la ubicación del gestor de archivos que utiliza y añada argumentos si es necesario. Los argumentos por defecto son "%d", y se introduce una ruta en esa ubicación. Por ejemplo, si se requiere un comando como "totalcmd.exe /A c:\windows", el argumento es /A "%d".
+ "%f" es un argumento que representa la ruta del archivo. Se utiliza para enfatizar el nombre de archivo/carpeta al abrir una ubicación específica de archivo en un gestor de archivos de terceros. Este argumento sólo está disponible en el elemento "Arg para Archivo". Si el gestor de archivos no tiene esa función, puede utilizar "%d".
+ Gestor de Archivos
+ Nombre de Perfil
+ Ruta del Gestor de Archivos
+ Arg para Carpeta
+ Arg para Archivo
+
+
+ Navegador Web Predeterminado
+ La configuración predeterminada sigue la configuración por defecto del navegador del sistema operativo. Si se especifica por separado, Flow utiliza ese navegador.
+ Navegador
+ Nombre del Navegador
+ Ruta del Navegador
+ Nueva Ventana
+ Nueva Pestaña
+ Modo Privado
+
+
+ Cambiar Prioridad
+ Mayor el número, mayor la clasificación del resultado. Intente establecerlo como 5. Si desea que los resultados sean inferiores a cualquier otro plugin, proporcione un número negativo
+ ¡Por favor, proporcione un entero válido para la prioridad!
+
+
+ Palabra Clave Antigua
+ Nueva Palabra Clave
+ Cancelar
+ Hecho
+ No se puede encontrar el plugin especificado
+ La nueva palabra clave no puede estar vacía
+ Esta palabra clave ya está asignada a otro plugin, por favor elija una diferente
+ Éxito
+ Completado con éxito
+ Introduzca la palabra clave que desea utilizar para iniciar el plugin. Utilice * si no desea especificar ninguno, y el plugin se activará sin ninguna palabra clave.
+
+
+ Tecla de Acceso Personalizada
+ Presione la tecla de acceso personalizada para insertar automáticamente la consulta especificada.
+ Vista previa
+ Tecla no disponible, por favor seleccione una nueva tecla de acceso directo
+ Tecla de acceso directo al plugin inválida
+ Actualizar
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Tecla No Disponible
+
+
+ Versión
+ Hora
+ Por favor, díganos cómo falló la aplicación para que podamos arreglarla
+ Enviar Reporte
+ Cancelar
+ General
+ Excepciones
+ Tipo de Excepción
+ Fuente
+ Traza de Pila
+ Enviando
+ Informe enviado correctamente
+ Error al enviar el informe
+ Flow Launcher ha tenido un error
+
+
+ Por favor espere...
+
+
+ Buscando nueva actualización
+ Ya esta instalada la última versión de Flow Launcher
+ Actualización encontrada
+ Actualizando...
+
+ Flow Launcher no pudo mover los datos de su perfil de usuario a la nueva versión de actualización.
+ Por favor, mueva manualmente la carpeta de datos de su perfil de {0} a {1}
+
+ Nueva Actualización
+ La nueva versión {0} de Flow Launcher ya está disponible
+ Ocurrió un error mientras se instalaban actualizaciones de software
+ Actualizar
+ Cancelar
+ Error al actualizar
+ Compruebe su conexión e intente actualizar la configuración del proxy a github-cloud.s3.amazonaws.com.
+ Esta actualización reiniciará Flow Launcher
+ Los siguientes archivos serán actualizados
+ Actualizar archivos
+ Actualizar descripción
+
+
+ Omitir
+ Bienvenido a Flow Launcher
+ ¡Hola, esta es la primera vez que ejecutas Flow Launcher!
+ Antes de comenzar, este asistente ayudará a configurar Flow Launcher. Puedes saltarlo si quieres. Por favor, elige un idioma
+ Busca y ejecuta todos los archivos y aplicaciones en tu PC
+ Busca todo desde aplicaciones, archivos, marcadores, YouTube, Twitter y mucho más. Todo desde la comodidad de tu teclado sin tocar nunca el ratón.
+ Flow Launcher comienza con la tecla de acceso directo de abajo, pruébala ahora. Para cambiarla, haga clic en la entrada y presione la tecla de acceso directo deseada.
+ Teclas De Acceso Directo
+ Palabra Clave y Comandos
+ Busca en la web, inicia aplicaciones o haz uso de varias funciones a través de plugins en Flow Launcher. Algunas funciones necesitan una palabra clave, y si es necesario, pueden ser usadas sin palabras clave. Pruebe consultar lo siguiente en Flow Launcher.
+ Comencemos Flow Launcher
+ Finalizado. Disfruta de Flow Launcher. No olvides la tecla de acceso directo para empezar :)
+
+
+
+ Atrás / Menú Contextual
+ Navegación de Elemento
+ Abrir Menú Contextual
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Historial de Consultas
+ Volver al Resultado en el Menú Contextual
+ Autocompletar
+ Abrir / Ejecutar Elemento Seleccionado
+ Abrir Ventana de Ajustes
+ Recargar Datos del Plugin
+
+ Clima
+ Clima en los Resultados de Google
+ > ping 8.8.8.8
+ Comando de Shell
+ s Bluetooth
+ Bluetooth en configuración de Windows
+ sn
+ Notas adhesivas
+
+
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
new file mode 100644
index 000000000..bc2c6c689
--- /dev/null
+++ b/Flow.Launcher/Languages/es.xaml
@@ -0,0 +1,367 @@
+
+
+
+ No se ha podido registrar el atajo de teclado: {0}
+ No se ha podido iniciar {0}
+ Formato de archivo del complemento de Flow Launcher no válido
+ Establecer como primer resultado en esta consulta
+ Cancelar como primer resultado en esta consulta
+ Ejecutar consulta: {0}
+ Hora de la última ejecución: {0}
+ Abrir
+ Configuración
+ Acerca de
+ Salir
+ Cerrar
+ Copiar
+ Cortar
+ Pegar
+ Deshacer
+ Seleccionar todo
+ Archivo
+ Carpeta
+ Texto
+ Modo Juego
+ Suspende el uso de atajos de teclado.
+ Restablecer posición
+ Restablece la posición de la ventana de búsqueda
+
+
+ Configuración
+ General
+ Modo Portable
+ Guarda toda la configuración y datos de usuario en una carpeta (Útil cuando se utiliza con unidades extraíbles o servicios en la nube).
+ Cargar Flow Launcher al iniciar el sistema
+ Error de configuración de arranque al iniciar
+ Ocultar Flow Launcher cuando se pierde el foco
+ No mostrar notificaciones de nuevas versiones
+ Posición de la ventana de búsqueda
+ Recordar última posición
+ Monitor con cursor del ratón
+ Monitor con ventana enfocada
+ Monitor principal
+ Monitor personalizado
+ Posición de la ventana de búsqueda en el monitor
+ Centro
+ Arriba en el centro
+ Arriba a la izquierda
+ Arriba a la derecha
+ Posición personalizada
+ Idioma
+ Estilo de la última consulta
+ Muestra/Oculta resultados anteriores cuando Flow Launcher es reactivado.
+ Mantener la última consulta
+ Seleccionar la última consulta
+ Limpiar la última consulta
+ Número máximo de resultados mostrados
+ También puede ajustarlo rápidamente usando CTRL+Más y CTRL+Menos.
+ Ignorar atajos de teclado en modo pantalla completa
+ No permite activar Flow Launcher con aplicaciones a pantalla completa (Recomendado para juegos).
+ Administrador de archivos predeterminado
+ Selecciona el administrador de archivos que se desea utilizar para abrir la carpeta.
+ Navegador web predeterminado
+ Configuración para Nueva Pestaña, Nueva Ventana, Modo Privado.
+ Ruta de Python
+ Ruta de Node.js
+ Seleccionar el ejecutable de Node.js
+ Seleccionar pythonw.exe
+ Empezar a escribir siempre en modo inglés
+ Cambia temporalmente el método de entrada al modo inglés cuando se activa Flow.
+ Actualización automática
+ Seleccionar
+ Ocultar Flow Launcher al inicio
+ Ocultar icono en la bandeja del sistema
+ Cuando el icono está oculto en la bandeja del sistema, se puede abrir el menú de configuración haciendo clic con el botón derecho en la ventana de búsqueda.
+ Precisión en la búsqueda de consultas
+ Cambia la puntuación mínima requerida para la coincidencia de los resultados.
+ Buscar con Pinyin
+ Permite utilizar Pinyin para la búsqueda. Pinyin es el sistema estándar de ortografía romanizado para traducir chino.
+ Mostrar siempre vista previa
+ Muestra siempre el panel de vista previa al iniciar Flow. Pulse {0} para mostrar/ocultar la vista previa.
+ El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque activado
+
+
+ Buscar complemento
+ Ctrl+F para buscar complementos
+ No se han encontrado resultados
+ Por favor, intente una búsqueda diferente.
+ Complemento
+ Complementos
+ Buscar más complementos
+ Activado
+ Desactivado
+ Configuración de la palabra clave de acción
+ Palabra clave de acción
+ Palabra clave de acción actual
+ Nueva palabra clave de acción
+ Cambia la palabra clave de acción
+ Prioridad actual
+ Nueva prioridad
+ Prioridad
+ Cambiar la prioridad de los resultados del complemento
+ Carpeta del complemento
+ por
+ Tiempo de inicio:
+ Tiempo de consulta:
+ Versión
+ Sitio web
+ Desinstalar
+
+
+
+ Tienda de complementos
+ Nuevo lanzamiento
+ Actualizado recientemente
+ Complementos
+ Instalado
+ Refrescar
+ Instalar
+ Desinstalar
+ Actualizar
+ Complemento ya instalado
+ Nueva versión
+ Este complemento ha sido actualizado en los últimos 7 días
+ Nueva actualización disponible
+
+
+
+
+ Tema
+ Apariencia
+ Galería de temas
+ Cómo crear un tema
+ Hola
+ Explorador
+ Buscar archivos, carpetas y contenido de archivos
+ Búsqueda Web
+ Buscar en la web con el apoyo de diferentes motores de búsqueda
+ Programa
+ Iniciar programas como administrador o como usuario diferente
+ Eliminar Procesos
+ Terminar procesos no deseados
+ Fuente del texto del cuadro de consulta
+ Fuente del texto de los resultados
+ Modo Ventana
+ Opacidad
+ El tema {0} no existe, activando el tema por defecto
+ Fallo al cargar el tema {0}, activando el tema predeterminado
+ Carpeta de temas del usuario
+ Abrir carpeta de temas
+ Esquema de colores
+ Predeterminado del sistema
+ Claro
+ Oscuro
+ Efecto de sonido
+ Reproduce un pequeño sonido cuando se abre el cuadro de búsqueda
+ Animación
+ Usar animación en la Interfaz de Usuario
+ Reloj
+ Fecha
+
+
+ Atajos de teclado
+ Atajos de teclado
+ Atajo de teclado de Flow Launcher
+ Introduzca el atajo de teclado para mostrar/ocultar Flow Launcher.
+ Atajo de teclado para vista previa
+ Introduzca el acceso directo para mostrar/ocultar la vista previa en la ventana de búsqueda.
+ Tecla modificadora para abrir resultado
+ Seleccione una tecla modificadora para abrir el resultado seleccionado con el teclado.
+ Mostrar atajo de teclado
+ Muestra atajo de teclado de selección junto a los resultados.
+ Atajos de teclado de consulta personalizada
+ Accesos directos de consulta personalizada
+ Accesos directos integrados
+ Consulta
+ Acceso directo
+ Expansión
+ Descripción
+ Eliminar
+ Editar
+ Añadir
+ Por favor, seleccione un elemento
+ ¿Está seguro que desea eliminar el atajo de teclado de consulta personalizada {0}?
+ ¿Está seguro que desea eliminar el acceso directo: {0} con la expansión {1}?
+ Obtiene el texto del portapapeles.
+ Obtiene la ruta del explorador activo.
+ Efecto de sombra de la ventana de consultas
+ El efecto de sombra hace un uso sustancial de la GPU. No se recomienda para ordenadores de rendimiento limitado.
+ Tamaño del ancho de la ventana
+ También puede ajustarlo rápidamente usando Ctrl+[y Ctrl+].
+ Usar iconos Segoe Fluent
+ Usa iconos Segoe Fluent para los resultados de la consulta cuando sean compatibles
+ Pulsar Tecla
+
+
+ Proxy HTTP
+ Habilitar proxy HTTP
+ Servidor HTTP
+ Puerto
+ Nombre de usuario
+ Contraseña
+ Probar proxy
+ Guardar
+ El campo del servidor no puede estar vacío
+ El campo puerto no puede estar vacío
+ Formato de puerto no válido
+ Configuración del proxy guardada correctamente
+ Proxy configurado correctamente
+ La conexión con el proxy ha fallado
+
+
+ Acerca de
+ Sitio web
+ GitHub
+ Documentación
+ Versión
+ Iconos
+ Ha activado Flow Launcher {0} veces
+ Buscar actualizaciones
+ Hágase Patrocinador
+ La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para actualizar?
+ La comprobación de las actualizaciones ha fallado, por favor, compruebe la configuración de su proxy y conexión a api.github.com.
+
+ La descarga de las actualizaciones ha fallado, por favor, compruebe la configuración de su proxy y conexión a github-cloud.s3.amazonaws.com,
+ o diríjase a https://github.com/Flow-Launcher/Flow.Launcher/releases para descargar actualizaciones manualmente.
+
+ Notas de la versión
+ Consejos de uso
+ Herramientas de desarrollador
+ Carpeta de configuración
+ Carpeta de registros
+ Eliminar registros
+ ¿Está seguro que desea eliminar todos los registros?
+ Asistente
+
+
+ Seleccionar administrador de archivos
+ Por favor, especifique la ubicación del administrador de archivos que desea utilizar y añada argumentos si es necesario. El argumento por defecto es "%d", introduciendo una ruta en esa ubicación. Por ejemplo, si se requiere un comando como "totalcmd.exe /A c:\windows", el argumento es /A "%d".
+ "%f" es un argumento que representa la ruta del archivo. Se utiliza para especificar el nombre de archivo/carpeta al abrir una ubicación específica con administradores de archivos de terceros. Este argumento sólo está disponible en el elemento "Argumentos del archivo". Si el administrador de archivos no tiene esa función, puede utilizar "%d".
+ Administrador de archivos
+ Nombre del perfil
+ Ruta del administrador de archivos
+ Argumentos de la carpeta
+ Argumentos del archivo
+
+
+ Navegador web predeterminado
+ La configuración por defecto utiliza el navegador predeterminado del sistema operativo. Si se indica uno específicamente, Flow Launcher utilizará este otro navegador.
+ Navegador
+ Nombre del navegador
+ Ruta del navegador
+ Nueva ventana
+ Nueva pestaña
+ Modo privado
+
+
+ Cambiar la prioridad
+ Cuanto mayor sea el número, más arriba se situará el resultado. Inténtelo con 5. Si desea que los resultados se situén más abajo que los de cualquier otro complemento, utilice un número negativo
+ ¡Por favor, proporcione un número entero válido para la prioridad!
+
+
+ Antigua palabra clave de acción
+ Nueva palabra clave de acción
+ Cancelar
+ Aceptar
+ No se puede encontrar el complemento especificado
+ La nueva palabra clave de acción no puede estar vacía
+ Esta nueva palabra clave de acción ya está asignada a otro complemento, por favor elija una diferente
+ Correcto
+ Finalizado correctamente
+ Introduzca la palabra clave que desea utilizar para iniciar el complemento. Utilice * si no desea especificar ninguna, y el complemento se activará sin ninguna palabra clave.
+
+
+ Atajo de teclado de consulta personalizada
+ Pulse el atajo de teclado personalizado para abrir Flow Launcher y realizar automáticamente la consulta especificada.
+ Vista previa
+ El atajo de teclado no está disponible, por favor seleccione uno nuevo
+ Atajo de teclado de complemento no válido
+ Actualizar
+
+
+ Acceso directo de consulta personalizada
+ Introduzca un acceso directo para expandir automáticamente la consulta especificada.
+ El acceso directo ya existe, por favor introduzca uno nuevo o edite el existente.
+ El acceso directo y/o su expansión están vacíos.
+
+
+ Atajo de teclado no disponible
+
+
+ Versión
+ Hora
+ Por favor, informe del fallo de la aplicación para poder solucionarlo
+ Enviar informe
+ Cancelar
+ General
+ Excepciones
+ Tipo de excepción
+ Origen
+ Rastreo de Pila
+ Enviando
+ Informe enviado correctamente
+ No se ha podido enviar el informe
+ Flow Launcher ha tenido un error
+
+
+ Por favor espere...
+
+
+ Comprobando actualizaciones
+ Ya tiene la última versión de Flow Launcher
+ Actualización encontrada
+ Actualizando...
+
+ Flow Launcher no pudo mover sus datos de perfil de usuario a la nueva versión de actualización.
+ Por favor, mueva manualmente la carpeta de datos de su perfil de {0} a {1}
+
+ Nueva actualización
+ La nueva versión {0} de Flow Launcher está disponible
+ Se ha producido un error al intentar instalar actualizaciones de software
+ Actualizar
+ Cancelar
+ La actualización ha fallado
+ Compruebe su conexión e intente actualizar la configuración del proxy a github-cloud.s3.amazonaws.com.
+ Esta actualización reiniciará Flow Launcher
+ Se actualizarán los siguientes archivos
+ Actualizar archivos
+ Actualizar descripción
+
+
+ Omitir
+ Bienvenido a Flow Launcher
+ Hola, ¡Esta es la primera vez que ejecuta Flow Launcher!
+ Antes de empezar, este asistente le ayudará a configurar Flow Launcher. Puede omitirlo si lo desea. Por favor, elija un idioma
+ Busque y ejecute todos los archivos y aplicaciones del equipo
+ Busque todo, desde aplicaciones, archivos, marcadores, YouTube, Twitter y más. Todo desde la comodidad del teclado y sin tener que tocar el ratón.
+ Flow Launcher se inicia con el atajo de teclado que se muestra a continuación, anímese y pruébelo ahora. Para cambiarlo, haga clic en la caja de texto y presione la nueva combinación de teclas.
+ Atajos de teclado
+ Palabra clave de acción y comandos
+ Busque en la web, inicie aplicaciones o ejecute diversas funciones mediante los complementos de Flow Launcher. Algunas funciones comienzan con una palabra clave de acción y, si es necesario, pueden utilizarse sin ellas. Pruebe las siguientes consultas en Flow Launcher.
+ Iniciemos Flow Launcher
+ Finalizado. Disfrute de Flow Launcher. No olvide utilizar el atajo de teclado para iniciar :)
+
+
+
+ Atrás / Menú contextual
+ Navegación entre elementos
+ Abrir menú contextual
+ Abrir la carpeta que contiene un archivo/carpeta
+ Ejecutar como administrador / Abrir la carpeta en el administrador de archivos predeterminado
+ Historial de consultas
+ Volver al resultado en menú contextual
+ Autocompletar
+ Abrir / Ejecutar elemento seleccionado
+ Abrir ventana de configuración
+ Recargar datos del complemento
+
+ El tiempo
+ El tiempo en los resultados de Google
+ > ping 8.8.8.8
+ Comando de terminal
+ s Bluetooth
+ Bluetooth en la configuración de Windows
+ sn
+ Notas adhesivas
+
+
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index d9c46e6b9..bf948cdc4 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -1,139 +1,366 @@
-
-
- Échec lors de l'enregistrement du raccourci : {0}
- Impossible de lancer {0}
- Le format de fichier n'est pas un plugin Flow Launcher valide
- Définir en tant que favori pour cette requête
- Annuler le favori
- Lancer la requête : {0}
- Dernière exécution : {0}
- Ouvrir
- Paramètres
- À propos
- Quitter
-
-
- Paramètres - Flow Launcher
- Général
- Lancer Flow Launcher au démarrage du système
- Cacher Flow Launcher lors de la perte de focus
- Ne pas afficher le message de mise à jour pour les nouvelles versions
- Se souvenir du dernier emplacement de la fenêtre
- Langue
- Affichage de la dernière recherche
- Conserver la dernière recherche
- Sélectionner la dernière recherche
- Ne pas afficher la dernière recherche
- Résultats maximums à afficher
- Ignore les raccourcis lorsqu'une application est en plein écran
- Répertoire de Python
- Mettre à jour automatiquement
- Sélectionner
- Cacher Flow Launcher au démarrage
-
-
- Modules
- Trouver plus de modules
- Désactivé
- Mot-clé d'action :
- Répertoire
- Auteur
- Chargement :
- Utilisation :
-
-
- Thèmes
- Trouver plus de thèmes
- Police (barre de recherche)
- Police (liste des résultats)
- Mode fenêtré
- Opacité
-
-
- Raccourcis
- Ouvrir Flow Launcher
- Modificateurs de résultats ouverts
- Requêtes personnalisées
- Afficher le raccourci clavier
- Supprimer
- Modifier
- Ajouter
- Veuillez sélectionner un élément
- Voulez-vous vraiment supprimer {0} raccourci(s) ?
-
-
- Proxy HTTP
- Activer le HTTP proxy
- Serveur HTTP
- Port
- Utilisateur
- Mot de passe
- Tester
- Sauvegarder
- Un serveur doit être indiqué
- Un port doit être indiqué
- Format du port invalide
- Proxy sauvegardé avec succès
- Le proxy est valide
- Connexion au proxy échouée
-
-
- À propos
- Site web
- Version
- Vous avez utilisé Flow Launcher {0} fois
- Vérifier les mises à jour
- Nouvelle version {0} disponible, veuillez redémarrer Flow Launcher
- Échec de la vérification de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à api.github.com.
- Échec du téléchargement de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à github-cloud.s3.amazonaws.com, ou téléchargez manuelement la mise à jour sur https://github.com/Flow-Launcher/Flow.Launcher/releases.
- Notes de changement :
-
-
- Ancien mot-clé d'action
- Nouveau mot-clé d'action
- Annuler
- Terminé
- Impossible de trouver le module spécifié
- Le nouveau mot-clé d'action doit être spécifié
- Le nouveau mot-clé d'action a été assigné à un autre module, veuillez en choisir un autre
- Ajouté
- Saisissez * si vous ne souhaitez pas utiliser de mot-clé spécifique
-
-
- Prévisualiser
- Raccourci indisponible. Veuillez en choisir un autre.
- Raccourci invalide
- Actualiser
-
-
- Raccourci indisponible
-
-
- Version
- Heure
- Veuillez nous indiquer comment l'application a planté afin que nous puissions le corriger
- Envoyer le rapport
- Annuler
- Général
- Exceptions
- Type d'exception
- Source
- Trace d'appel
- Envoi en cours
- Signalement envoyé
- Échec de l'envoi du signalement
- Flow Launcher a rencontré une erreur
-
-
- Version v{0} de Flow Launcher disponible
- Une erreur s'est produite lors de l'installation de la mise à jour
- Mettre à jour
- Annuler
- Flow Launcher doit redémarrer pour installer cette mise à jour
- Les fichiers suivants seront mis à jour
- Fichiers mis à jour
- Description de la mise à jour
-
-
+
+
+
+ Impossible d'enregistrer le raccourci clavier : {0}
+ Impossible de lancer {0}
+ Le fichier n'a pas le format d'un plugin de Flow Launcher
+ Définir comme prioritaire dans cette requête
+ Annuler la priorité dans cette requête
+ Lancer la requête : {0}
+ Dernière exécution : {0}
+ Ouvrir
+ Paramètres
+ À propos
+ Quitter
+ Fermer
+ Copier
+ Couper
+ Coller
+ Undo
+ Select All
+ Fichier
+ Dossier
+ Texte
+ Mode Jeu
+ Suspend l'utilisation des raccourcis claviers.
+ Position Reset
+ Reset search window position
+
+
+ Paramètres
+ Général
+ Mode Portable
+ Stocker tous les paramètres et données utilisateur dans un seul dossier (Pratique en cas d'utilisation de disques amovibles ou de services cloud).
+ Lancer Flow Launcher au démarrage du système
+ Error setting launch on startup
+ Cacher Flow Launcher lors de la perte de focus
+ Ne pas afficher les notifications lors d'une nouvelle version
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Langue
+ Style de la dernière requête
+ Afficher/Masquer les résultats précédents lorsque Flow Launcher est réactivé.
+ Conserver la dernière recherche
+ Sélectionner la dernière recherche
+ Ne pas afficher la dernière recherche
+ Résultats maximums à afficher
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignore les raccourcis lorsqu'une application est en plein écran
+ Désactiver l'activation de Flow Launcher lorsqu'une application en plein écran est active (Recommandé pour les jeux).
+ Gestionnaire de fichiers par défaut
+ Sélectionnez le gestionnaire de fichiers à utiliser lors de l'ouverture du dossier.
+ Navigateur web par défaut
+ Réglage pour Nouvel onglet, Nouvelle fenêtre, Mode privé.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Mettre à jour automatiquement
+ Sélectionner
+ Cacher Flow Launcher au démarrage
+ Masquer icône du plateau
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Précision de la recherche
+ Modifie le score de correspondance minimum requis pour les résultats.
+ Devrait utiliser le pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ L'effet d'ombre n'est pas autorisé lorsque le thème actuel à un effet de flou activé
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Modules
+ Trouver plus de modules
+ On
+ Désactivé
+ Action keyword Setting
+ Mot-clé d'action :
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Priorité actuelle
+ Nouvelle priorité
+ Priorité
+ Change Plugin Results Priority
+ Répertoire
+ par
+ Chargement :
+ Utilisation :
+ Version
+ Site Web
+ Désinstaller
+
+
+
+ Magasin des Plugins
+ New Release
+ Recently Updated
+ Modules
+ Installed
+ Rafraîchir
+ Installer
+ Désinstaller
+ Actualiser
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Thèmes
+ Appearance
+ Trouver plus de thèmes
+ Comment créer un thème
+ Salut
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Police (barre de recherche)
+ Police (liste des résultats)
+ Mode fenêtré
+ Opacité
+ Le thème {0} n'existe pas, retour au thème par défaut
+ Impossible de charger le thème {0}, retour au thème par défaut
+ Dossier des thèmes
+ Ouvrir le dossier des thèmes
+ Mode visuelle
+ Suivre le système
+ Clair
+ Sombre
+ Effet Sonore
+ Jouer un petit son lorsque la fenêtre de recherche s'ouvre
+ Animation
+ Utiliser l'animation dans l'interface
+ Clock
+ Date
+
+
+ Raccourcis
+ Raccourcis
+ Ouvrir Flow Launcher
+ Entrez le raccourci pour afficher/masquer Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Modificateurs de résultats ouverts
+ Sélectionnez une touche de modification pour ouvrir le résultat sélectionné via le clavier.
+ Afficher le raccourci clavier
+ Show result selection hotkey with results.
+ Requêtes personnalisées
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Supprimer
+ Modifier
+ Ajouter
+ Veuillez sélectionner un élément
+ Voulez-vous vraiment supprimer {0} raccourci(s) ?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ Proxy HTTP
+ Activer le HTTP proxy
+ Serveur HTTP
+ Port
+ Utilisateur
+ Mot de passe
+ Tester
+ Sauvegarder
+ Un serveur doit être indiqué
+ Un port doit être indiqué
+ Format du port invalide
+ Proxy sauvegardé avec succès
+ Le proxy est valide
+ Connexion au proxy échouée
+
+
+ À propos
+ Site Web
+ GitHub
+ Docs
+ Version
+ Icons
+ Vous avez utilisé Flow Launcher {0} fois
+ Vérifier les mises à jour
+ Become A Sponsor
+ Nouvelle version {0} disponible, veuillez redémarrer Flow Launcher
+ Échec de la vérification de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à api.github.com.
+
+ Échec du téléchargement de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à github-cloud.s3.amazonaws.com, ou téléchargez manuelement la mise à jour sur https://github.com/Flow-Launcher/Flow.Launcher/releases.
+
+ Notes de changement
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Navigateur web par défaut
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Navigateur
+ Nom du navigateur
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Ancien mot-clé d'action
+ Nouveau mot-clé d'action
+ Annuler
+ Terminé
+ Impossible de trouver le module spécifié
+ Le nouveau mot-clé d'action doit être spécifié
+ Le nouveau mot-clé d'action a été assigné à un autre module, veuillez en choisir un autre
+ Ajouté
+ Completed successfully
+ Saisissez * si vous ne souhaitez pas utiliser de mot-clé spécifique
+
+
+ Requêtes personnalisées
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Prévisualiser
+ Raccourci indisponible. Veuillez en choisir un autre.
+ Raccourci invalide
+ Actualiser
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Raccourci indisponible
+
+
+ Version
+ Heure
+ Veuillez nous indiquer comment l'application a planté afin que nous puissions le corriger
+ Envoyer le rapport
+ Annuler
+ Général
+ Exceptions
+ Type d'exception
+ Source
+ Trace d'appel
+ Envoi en cours
+ Signalement envoyé
+ Échec de l'envoi du signalement
+ Flow Launcher a rencontré une erreur
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Version v{0} de Flow Launcher disponible
+ Une erreur s'est produite lors de l'installation de la mise à jour
+ Actualiser
+ Annuler
+ La mise à jour a échoué
+ Vérifiez votre connexion et essayez de mettre à jour les paramètres du proxy vers github-cloud.s3.amazonaws.com.
+ Flow Launcher doit redémarrer pour installer cette mise à jour
+ Les fichiers suivants seront mis à jour
+ Fichiers mis à jour
+ Description de la mise à jour
+
+
+ Passer
+ Bienvenue dans Flow Launcher
+ Bonjour, c'est la première fois que vous utilisez Flow Launcher !
+ Avant de commencer, cet assistant vous aidera à configurer Flow Launcher. Vous pouvez sauter cela si vous le souhaitez. Veuillez choisir une langue
+ Recherchez et exécutez tous les fichiers et applications sur votre PC
+ Recherchez tout, depuis les applications, les fichiers, les signets, YouTube, Twitter et plus encore. Tout cela depuis le confort de votre clavier sans jamais toucher à la souris.
+ Flow Launcher commence avec le raccourci ci-dessous, allez-y et essayez maintenant. Pour le modifier, cliquez sur l'entrée et appuyez sur la touche de raccourci désirée du clavier.
+ Raccourcis claviers
+ Action Keyword and Commands
+ Recherchez sur le web, lancez des applications ou exécutez diverses fonctions grâce aux plugins Flow Launcher. Certaines fonctions commencent par un mot clé d'action, et si nécessaire, elles peuvent être utilisées sans mots clés d'action. Essayez les requêtes ci-dessous dans Flow Launcher.
+ Démarrons Flow Launcher
+ Terminé. Profitez de Flow Launcher. N'oubliez pas le raccourci pour le démarrer :)
+
+
+
+ Retour / Menu contextuel
+ Item Navigation
+ Ouvrir le Menu Contextuel
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Historique des Recherches
+ Retour au résultat dans le Menu Contextuel
+ Auto-complétion
+ Ouvrir/Exécuter l'Élément Sélectionné
+ Ouvrir la Fenêtre des Réglages
+ Recharger les Données des Plugins
+
+ Météo
+ Météo dans les résultats Google
+ > ping 8.8.8.8
+ Commande Shell
+ s Bluetooth
+ Bluetooth dans les Paramètres de Windows
+ sn
+ Pense-bêtes
+
+
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 0302a1531..79c7e4fd5 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -1,142 +1,367 @@
-
-
- Impossibile salvare il tasto di scelta rapida: {0}
- Avvio fallito {0}
- Formato file plugin non valido
- Risultato prioritario con questa query
- Rimuovi risultato prioritario con questa query
- Query d'esecuzione: {0}
- Ultima esecuzione: {0}
- Apri
- Impostazioni
- About
- Esci
-
-
- Impostaizoni Flow Launcher
- Generale
- Avvia Wow all'avvio di Windows
- Nascondi Flow Launcher quando perde il focus
- Non mostrare le notifiche per una nuova versione
- Ricorda l'ultima posizione di avvio del launcher
- Lingua
- Comportamento ultima ricerca
- Conserva ultima ricerca
- Seleziona ultima ricerca
- Cancella ultima ricerca
- Numero massimo di risultati mostrati
- Ignora i tasti di scelta rapida in applicazione a schermo pieno
- Cartella Python
- Aggiornamento automatico
- Seleziona
- Nascondi Flow Launcher all'avvio
-
-
- Plugin
- Cerca altri plugins
- Disabilita
- Parole chiave
- Cartella Plugin
- Autore
- Tempo di avvio:
- Tempo ricerca:
-
-
- Tema
- Sfoglia per altri temi
- Font campo di ricerca
- Font campo risultati
- Modalità finestra
- Opacità
-
-
- Tasti scelta rapida
- Tasto scelta rapida Flow Launcher
- Apri modificatori di risultato
- Tasti scelta rapida per ricerche personalizzate
- Mostra tasto di scelta rapida
- Cancella
- Modifica
- Aggiungi
- Selezionare un oggetto
- Volete cancellare il tasto di scelta rapida per il plugin {0}?
-
-
- Proxy HTTP
- Abilita Proxy HTTP
- Server HTTP
- Porta
- User Name
- Password
- Proxy Test
- Salva
- Il campo Server non può essere vuoto
- Il campo Porta non può essere vuoto
- Formato Porta non valido
- Configurazione Proxy salvata correttamente
- Proxy Configurato correttamente
- Connessione Proxy fallita
-
-
- About
- Sito web
- Versione
- Hai usato Flow Launcher {0} volte
- Cerca aggiornamenti
- Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.
- Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.
-
- Download degli aggiornamenti fallito, per favore controlla la tua connessione ed eventuali impostazioni proxy per github-cloud.s3.amazonaws.com,
- oppure vai su https://github.com/Flow-Launcher/Flow.Launcher/releases per scaricare gli aggiornamenti manualmente.
-
- Note di rilascio:
-
-
- Vecchia parola chiave d'azione
- Nuova parola chiave d'azione
- Annulla
- Conferma
- Impossibile trovare il plugin specificato
- La nuova parola chiave d'azione non può essere vuota
- La nuova parola chiave d'azione è stata assegnata ad un altro plugin, per favore sceglierne una differente
- Successo
- Usa * se non vuoi specificare una parola chiave d'azione
-
-
- Anteprima
- Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida
- Tasto di scelta rapida plugin non valido
- Aggiorna
-
-
- Tasto di scelta rapida non disponibile
-
-
- Versione
- Tempo
- Per favore raccontaci come l'applicazione si è chiusa inaspettatamente così che possimo risolvere il problema
- Invia rapporto
- Annulla
- Generale
- Eccezioni
- Tipo di eccezione
- Risorsa
- Traccia dello stack
- Invio in corso
- Rapporto inviato correttamente
- Invio rapporto fallito
- Flow Launcher ha riportato un errore
-
-
- E' disponibile la nuova release {0} di Flow Launcher
- Errore durante l'installazione degli aggiornamenti software
- Aggiorna
- Annulla
- Questo aggiornamento riavvierà Flow Launcher
- I seguenti file saranno aggiornati
- File aggiornati
- Descrizione aggiornamento
-
-
\ No newline at end of file
+
+
+
+ Impossibile salvare il tasto di scelta rapida: {0}
+ Avvio fallito {0}
+ Formato file plugin non valido
+ Risultato prioritario con questa query
+ Rimuovi risultato prioritario con questa query
+ Query d'esecuzione: {0}
+ Ultima esecuzione: {0}
+ Apri
+ Impostazioni
+ Informazioni
+ Esci
+ Chiudi
+ Copia
+ Taglia
+ Incolla
+ Undo
+ Select All
+ File
+ Cartella
+ Testo
+ Modalità gioco
+ Sospendere l'uso dei tasti di scelta rapida.
+ Position Reset
+ Reset search window position
+
+
+ Impostazioni
+ Generale
+ Modalità portatile
+ Memorizzare tutte le impostazioni e i dati dell'utente in un'unica cartella (utile se utilizzato con unità rimovibili o servizi cloud).
+ Avvia Wow all'avvio di Windows
+ Error setting launch on startup
+ Nascondi Flow Launcher quando perde il focus
+ Non mostrare le notifiche per una nuova versione
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Lingua
+ Comportamento ultima ricerca
+ Mostra/nasconde i risultati precedenti quando Flow Launcher viene riattivato.
+ Conserva ultima ricerca
+ Seleziona ultima ricerca
+ Cancella ultima ricerca
+ Numero massimo di risultati mostrati
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignora i tasti di scelta rapida in applicazione a schermo pieno
+ Disattivare l'attivazione di Flow Launcher quando è attiva un'applicazione a schermo intero (consigliato per i giochi).
+ Gestore File predefinito
+ Selezionare il Gestore file da usare all'apertura della cartella.
+ Browser predefinito
+ Impostazione per Nuova scheda, Nuova finestra, Modalità privata.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Aggiornamento automatico
+ Seleziona
+ Nascondi Flow Launcher all'avvio
+ Nascondi Icona nell'Area di Notifica
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Precisione di ricerca delle query
+ Modifica il punteggio minimo richiesto per i risultati.
+ Dovrebbe usare il Pinyin
+ Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Cerca altri plugins
+ Attivo
+ Disabilita
+ Impostazioni parola chiave Azione
+ Parole chiave
+ Parola chiave di azione corrente
+ Nuova parola chiave d'azione
+ Cambia Keywords Azione
+ Priorità Attuale
+ Nuova Priorità
+ Priorità
+ Change Plugin Results Priority
+ Cartella Plugin
+ da
+ Tempo di avvio:
+ Tempo ricerca:
+ Versione
+ Sito Web
+ Disinstalla
+
+
+
+ Negozio dei Plugin
+ New Release
+ Recently Updated
+ Plugin
+ Installed
+ Aggiorna
+ Installa
+ Disinstalla
+ Aggiorna
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Tema
+ Appearance
+ Sfoglia per altri temi
+ Come creare un tema
+ Ciao
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Font campo di ricerca
+ Font campo risultati
+ Modalità finestra
+ Opacità
+ Il tema {0} non esiste, si ritorna al tema predefinito
+ Impossibile caricare il tema {0}, si torna al tema predefinito
+ Cartella temi
+ Apri cartella del tema
+ Schema di colore
+ Sistema predefinito
+ Chiaro
+ Scuro
+ Effetto sonoro
+ Riproduce un piccolo suono all'apertura della finestra di ricerca
+ Animazione
+ Usa l'animazione nell'interfaccia utente
+ Clock
+ Date
+
+
+ Tasti scelta rapida
+ Tasti scelta rapida
+ Tasto scelta rapida Flow Launcher
+ Immettere la scorciatoia per mostrare/nascondere Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Apri modificatori di risultato
+ Select a modifier key to open selected result via keyboard.
+ Mostra tasto di scelta rapida
+ Show result selection hotkey with results.
+ Tasti scelta rapida per ricerche personalizzate
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Cancella
+ Modifica
+ Aggiungi
+ Selezionare un oggetto
+ Volete cancellare il tasto di scelta rapida per il plugin {0}?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ Proxy HTTP
+ Abilita Proxy HTTP
+ Server HTTP
+ Porta
+ Nome utente
+ Password
+ Proxy Test
+ Salva
+ Il campo Server non può essere vuoto
+ Il campo Porta non può essere vuoto
+ Formato Porta non valido
+ Configurazione Proxy salvata correttamente
+ Proxy Configurato correttamente
+ Connessione Proxy fallita
+
+
+ Informazioni
+ Sito web
+ GitHub
+ Documentazione
+ Versione
+ Icons
+ Hai usato Flow Launcher {0} volte
+ Cerca aggiornamenti
+ Become A Sponsor
+ Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.
+ Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.
+
+ Download degli aggiornamenti fallito, per favore controlla la tua connessione ed eventuali impostazioni proxy per github-cloud.s3.amazonaws.com,
+ oppure vai su https://github.com/Flow-Launcher/Flow.Launcher/releases per scaricare gli aggiornamenti manualmente.
+
+ Note di rilascio
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Browser predefinito
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Nome del browser
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Vecchia parola chiave d'azione
+ Nuova parola chiave d'azione
+ Annulla
+ Conferma
+ Impossibile trovare il plugin specificato
+ La nuova parola chiave d'azione non può essere vuota
+ La nuova parola chiave d'azione è stata assegnata ad un altro plugin, per favore sceglierne una differente
+ Successo
+ Completed successfully
+ Usa * se non vuoi specificare una parola chiave d'azione
+
+
+ Tasti scelta rapida per ricerche personalizzate
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Anteprima
+ Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida
+ Tasto di scelta rapida plugin non valido
+ Aggiorna
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Tasto di scelta rapida non disponibile
+
+
+ Versione
+ Tempo
+ Per favore raccontaci come l'applicazione si è chiusa inaspettatamente così che possimo risolvere il problema
+ Invia rapporto
+ Annulla
+ Generale
+ Eccezioni
+ Tipo di eccezione
+ Risorsa
+ Traccia dello stack
+ Invio in corso
+ Rapporto inviato correttamente
+ Invio rapporto fallito
+ Flow Launcher ha riportato un errore
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ E' disponibile la nuova release {0} di Flow Launcher
+ Errore durante l'installazione degli aggiornamenti software
+ Aggiorna
+ Annulla
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Questo aggiornamento riavvierà Flow Launcher
+ I seguenti file saranno aggiornati
+ File aggiornati
+ Descrizione aggiornamento
+
+
+ Salta
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Cerca ed esegue tutti i file e le applicazioni presenti sul PC
+ Cerca tutto da applicazioni, file, segnalibri, YouTube, Twitter e altro ancora. Tutto dalla comodità della tastiera senza mai toccare il mouse.
+ Flow Launcher si avvia con il tasto di scelta rapida qui sotto, provatelo subito. Per cambiarlo, fate clic sull'input e premete il tasto di scelta rapida desiderato sulla tastiera.
+ Scorciatoie
+ Scorciatoie e comandi
+ Cercate sul web, avviate applicazioni o eseguite varie funzioni tramite i plugin di Flow Launcher. Alcune funzioni iniziano con una parola chiave di azione e, se necessario, possono essere utilizzate senza parole chiave di azione. Provate le query seguenti in Flow Launcher.
+ Avviamo Flow Launcher
+ Finito. Goditi Flow Launcher. Non dimenticare il tasto di scelta rapida per iniziare :)
+
+
+
+ Indietro / Menu contestuale
+ Navigazione tra le voci
+ Apri il menu di scelta rapida
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Cronologia Query
+ Torna al risultato nel menu contestuale
+ Autocompleta
+ Apri / Esegui Elemento Selezionato
+ Aprire la finestra delle impostazioni
+ Ricarica i dati del plugin
+
+ Meteo
+ Meteo nel risultato di Google
+ > ping 8.8.8.8
+ Comando Della shell
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index 3fc6296c1..dc389355e 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -1,145 +1,367 @@
-
-
- ホットキー「{0}」の登録に失敗しました
- {0}の起動に失敗しました
- Flow Launcherプラグインの形式が正しくありません
- このクエリを最上位にセットする
- このクエリを最上位にセットをキャンセル
- 次のコマンドを実行します:{0}
- 最終実行時間:{0}
- 開く
- 設定
- Flow Launcherについて
- 終了
-
-
- Flow Launcher設定
- 一般
- スタートアップ時にFlow Launcherを起動する
- フォーカスを失った時にFlow Launcherを隠す
- 最新版が入手可能であっても、アップグレードメッセージを表示しない
- 前回のランチャーの位置を記憶
- 言語
- 前回のクエリの扱い
- 前回のクエリを保存
- 前回のクエリを選択
- 前回のクエリを消去
- 結果の最大表示件数
- ウィンドウがフルスクリーン時にホットキーを無効にする
- Pythonのディレクトリ
- 自動更新
- 選択
- 起動時にFlow Launcherを隠す
- トレイアイコンを隠す
-
-
- プラグイン
- プラグインを探す
- 無効
- キーワード
- プラグイン・ディレクトリ
- 作者
- 初期化時間:
- クエリ時間:
-
-
- テーマ
- テーマを探す
- 検索ボックスのフォント
- 検索結果一覧のフォント
- ウィンドウモード
- 透過度
- テーマ {0} が存在しません、デフォルトのテーマに戻します。
- テーマ {0} を読み込めません、デフォルトのテーマに戻します。
-
-
- ホットキー
- Flow Launcher ホットキー
- 結果修飾子を開く
- カスタムクエリ ホットキー
- ホットキーを表示
- 削除
- 編集
- 追加
- 項目選択してください
- {0} プラグインのホットキーを本当に削除しますか?
-
-
- HTTP プロキシ
- HTTP プロキシを有効化
- HTTP サーバ
- ポート
- ユーザ名
- パスワード
- プロキシをテストする
- 保存
- サーバーは空白にできません
- ポートは空白にできません
- ポートの形式が正しくありません
- プロキシの保存に成功しました
- プロキシは正しいです
- プロキシ接続に失敗しました
-
-
- Flow Launcherについて
- ウェブサイト
- バージョン
- あなたはFlow Launcherを {0} 回利用しました
- アップデートを確認する
- 新しいバージョン {0} が利用可能です。Flow Launcherを再起動してください。
- アップデートの確認に失敗しました、api.github.com への接続とプロキシ設定を確認してください。
-
- 更新のダウンロードに失敗しました、github-cloud.s3.amazonaws.com への接続とプロキシ設定を確認するか、
- https://github.com/Flow-Launcher/Flow.Launcher/releases から手動でアップデートをダウンロードしてください。
-
- リリースノート:
-
-
- 古いアクションキーボード
- 新しいアクションキーボード
- キャンセル
- 完了
- プラグインが見つかりません
- 新しいアクションキーボードを空にすることはできません
- 新しいアクションキーボードは他のプラグインに割り当てられています。他のアクションキーボードを指定してください
- 成功しました
- アクションキーボードを指定しない場合、* を使用してください
-
-
- プレビュー
- ホットキーは使用できません。新しいホットキーを選択してください
- プラグインホットキーは無効です
- 更新
-
-
- ホットキーは使用できません
-
-
- バージョン
- 時間
- アプリケーションが突然終了した手順を私たちに教えてくださると、バグ修正ができます
- クラッシュレポートを送信
- キャンセル
- 一般
- 例外
- 例外の種類
- ソース
- スタックトレース
- 送信中
- クラッシュレポートの送信に成功しました
- クラッシュレポートの送信に失敗しました
- Flow Launcherにエラーが発生しました
-
-
- Flow Launcher の最新バージョン V{0} が入手可能です
- Flow Launcherのアップデート中にエラーが発生しました
- アップデート
- キャンセル
- このアップデートでは、Flow Launcherの再起動が必要です
- 次のファイルがアップデートされます
- 更新ファイル一覧
- アップデートの詳細
-
-
\ No newline at end of file
+
+
+
+ ホットキー「{0}」の登録に失敗しました
+ {0}の起動に失敗しました
+ Flow Launcherプラグインの形式が正しくありません
+ このクエリを最上位にセットする
+ このクエリを最上位にセットをキャンセル
+ 次のコマンドを実行します:{0}
+ 最終実行時間:{0}
+ 開く
+ 設定
+ Flow Launcherについて
+ 終了
+ Close
+ Copy
+ 切り取り
+ 貼り付け
+ Undo
+ Select All
+ File
+ Folder
+ Text
+ ゲームモード
+ Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
+
+
+ 設定
+ 一般
+ Portable Mode
+ Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ スタートアップ時にFlow Launcherを起動する
+ Error setting launch on startup
+ フォーカスを失った時にFlow Launcherを隠す
+ 最新版が入手可能であっても、アップグレードメッセージを表示しない
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ 言語
+ 前回のクエリの扱い
+ Show/Hide previous results when Flow Launcher is reactivated.
+ 前回のクエリを保存
+ 前回のクエリを選択
+ 前回のクエリを消去
+ 結果の最大表示件数
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ ウィンドウがフルスクリーン時にホットキーを無効にする
+ Disable Flow Launcher activation when a full screen application is active (Recommended for games).
+ Default File Manager
+ Select the file manager to use when opening the folder.
+ Default Web Browser
+ Setting for New Tab, New Window, Private Mode.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ 自動更新
+ 選択
+ 起動時にFlow Launcherを隠す
+ トレイアイコンを隠す
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ プラグイン
+ プラグインを探す
+ 有効
+ 無効
+ Action keyword Setting
+ キーワード
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Current Priority
+ New Priority
+ 重要度
+ Change Plugin Results Priority
+ プラグイン・ディレクトリ
+ by
+ 初期化時間:
+ クエリ時間:
+ バージョン
+ ウェブサイト
+ アンインストール
+
+
+
+ プラグインストア
+ New Release
+ Recently Updated
+ プラグイン
+ Installed
+ Refresh
+ Install
+ アンインストール
+ 更新
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ テーマ
+ Appearance
+ テーマを探す
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ 検索ボックスのフォント
+ 検索結果一覧のフォント
+ ウィンドウモード
+ 透過度
+ テーマ {0} が存在しません、デフォルトのテーマに戻します。
+ テーマ {0} を読み込めません、デフォルトのテーマに戻します。
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Animation
+ Use Animation in UI
+ Clock
+ Date
+
+
+ ホットキー
+ ホットキー
+ Flow Launcher ホットキー
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ 結果修飾子を開く
+ Select a modifier key to open selected result via keyboard.
+ ホットキーを表示
+ Show result selection hotkey with results.
+ カスタムクエリ ホットキー
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ 説明
+ 削除
+ 編集
+ 追加
+ 項目選択してください
+ {0} プラグインのホットキーを本当に削除しますか?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP プロキシ
+ HTTP プロキシを有効化
+ HTTP サーバ
+ ポート
+ ユーザ名
+ パスワード
+ プロキシをテストする
+ 保存
+ サーバーは空白にできません
+ ポートは空白にできません
+ ポートの形式が正しくありません
+ プロキシの保存に成功しました
+ プロキシは正しいです
+ プロキシ接続に失敗しました
+
+
+ Flow Launcherについて
+ ウェブサイト
+ GitHub
+ Docs
+ バージョン
+ Icons
+ あなたはFlow Launcherを {0} 回利用しました
+ アップデートを確認する
+ Become A Sponsor
+ 新しいバージョン {0} が利用可能です。Flow Launcherを再起動してください。
+ アップデートの確認に失敗しました、api.github.com への接続とプロキシ設定を確認してください。
+
+ 更新のダウンロードに失敗しました、github-cloud.s3.amazonaws.com への接続とプロキシ設定を確認するか、
+ https://github.com/Flow-Launcher/Flow.Launcher/releases から手動でアップデートをダウンロードしてください。
+
+ リリースノート
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ 古いアクションキーボード
+ 新しいアクションキーボード
+ キャンセル
+ 完了
+ プラグインが見つかりません
+ 新しいアクションキーボードを空にすることはできません
+ 新しいアクションキーボードは他のプラグインに割り当てられています。他のアクションキーボードを指定してください
+ 成功しました
+ Completed successfully
+ アクションキーボードを指定しない場合、* を使用してください
+
+
+
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ プレビュー
+ ホットキーは使用できません。新しいホットキーを選択してください
+ プラグインホットキーは無効です
+ 更新
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ ホットキーは使用できません
+
+
+ バージョン
+ 時間
+ アプリケーションが突然終了した手順を私たちに教えてくださると、バグ修正ができます
+ クラッシュレポートを送信
+ キャンセル
+ 一般
+ 例外
+ 例外の種類
+ ソース
+ スタックトレース
+ 送信中
+ クラッシュレポートの送信に成功しました
+ クラッシュレポートの送信に失敗しました
+ Flow Launcherにエラーが発生しました
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Flow Launcher の最新バージョン V{0} が入手可能です
+ Flow Launcherのアップデート中にエラーが発生しました
+ 更新
+ キャンセル
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ このアップデートでは、Flow Launcherの再起動が必要です
+ 次のファイルがアップデートされます
+ 更新ファイル一覧
+ アップデートの詳細
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ プラグインデータのリロード
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index 7184bef34..f85d3bbb8 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -1,285 +1,367 @@
-
-
- 단축키 등록 실패: {0}
- {0}을 실행할 수 없습니다.
- Flow Launcher 플러그인 파일 형식이 유효하지 않습니다.
- 이 쿼리의 최상위로 설정
- 이 쿼리의 최상위 설정 취소
- 쿼리 실행: {0}
- 마지막 실행 시간: {0}
- 열기
- 설정
- 정보
- 종료
- 닫기
- 복사
- 잘라내기
- 붙여넣기
- 게임 모드
- 단축키 사용을 일시중단합니다.
-
-
- Flow Launcher 설정
- 일반
- 포터블 모드
- 모든 설정이 폴더안에 들어갑니다. USB 드라이브나 클라우드로 사용 가능합니다.
- 시스템 시작 시 Flow Launcher 실행
- 포커스 잃으면 Flow Launcher 숨김
- 새 버전 알림 끄기
- 마지막 실행 위치 기억
- 언어
- 마지막 쿼리 스타일
- 쿼리박스를 열었을 때 쿼리 처리 방식
- 직전 쿼리에 계속 입력
- 직전 쿼리 내용 선택
- 직전 쿼리 지우기
- 표시할 결과 수
- 전체화면 모드에서는 단축키 무시
- 게이머라면 켜는 것을 추천합니다.
- 기본 파일관리자
- 폴더를 열 때 사용할 파일관리자를 선택하세요.
- 기본 웹 브라우저
- 새 탭, 새 창, 프라이빗 모드 설정
- Python 디렉토리
- 자동 업데이트
- 선택
- 시작 시 Flow Launcher 숨김
- 트레이 아이콘 숨기기
- 쿼리 검색 정밀도
- 검색 결과에 필요한 최소 매치 점수를 변경합니다.
- 항상 Pinyin 사용
- Pinyin을 사용하여 검색할 수 있습니다. Pinyin(병음)은 로마자 중국어 입력 방식입니다.
- 반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다.
-
-
- 플러그인
- 플러그인 더 찾아보기
- 켬
- 끔
- 액션 키워드
- 현재 액션 키워드
- 새 액션 키워드
- 현재 중요도:
- 새 중요도:
- 중요도
- 플러그인 폴더
- 제작자
- 초기화 시간:
- 쿼리 시간:
- | 버전
- 웹사이트
-
-
-
- 플러그인 스토어
- 새로고침
- 설치
-
-
-
- 테마
- 테마 갤러리
- 테마 제작 안내
- Hi There
- 쿼리 상자 글꼴
- 결과 항목 글꼴
- 윈도우 모드
- 투명도
- {0} 테마가 존재하지 않습니다. 기본 테마로 변경합니다.
- {0} 테마 로드에 실패했습니다. 기본 테마로 변경합니다.
- 테마 폴더
- 테마 폴더 열기
- 앱 색상
- 시스템 기본
- 밝게
- 어둡게
- 소리 효과
- 검색창을 열 때 작은 소리를 재생합니다.
- 애니메이션
- 일부 UI에 애니메이션을 사용합니다.
-
-
- 단축키
- Flow Launcher 단축키
- Flow Launcher를 열 때 사용할 단축키를 입력합니다.
- 결과 선택 단축키
- 결과 목록을 선택하는 단축키입니다.
- 단축키 표시
- 결과창에서 결과 선택 단축키를 표시합니다.
- 사용자지정 쿼리 단축키
- 쿼리
- 삭제
- 편집
- 추가
- 항목을 선택하세요.
- {0} 플러그인 단축키를 삭제하시겠습니까?
- 그림자 효과
- 그림자 효과는 GPU를 사용합니다. 컴퓨터 퍼포먼스가 제한적인 경우 사용을 추천하지 않습니다.
- 창 넓이
- 플루언트 아이콘 사용
- 결과 및 일부 메뉴에서 플루언트 아이콘을 사용합니다.
-
-
- HTTP 프록시
- HTTP 프록시 켜기
- HTTP 서버
- 포트
- 사용자명
- 패스워드
- 프록시 테스트
- 저장
- 서버를 입력하세요.
- 포트를 입력하세요.
- 유효하지 않은 포트 형식
- 프록시 설정이 저장되었습니다.
- 프록시 설정 정상
- 프록시 연결 실패
-
-
- 정보
- 웹사이트
- Github
- 문서
- 버전
- Flow Launcher를 {0}번 실행했습니다.
- 업데이트 확인
- 새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.
- 업데이트 확인을 실패했습니다. api.github.com로의 연결 또는 프록시 설정을 확인해주세요.
-
- 업데이트 다운로드에 실패했습니다. github-cloud.s3.amazonaws.com의 연결 또는 프록시 설정을 확인해주세요.
- 수동 다운로드를 하려면 https://github.com/Flow-Launcher/Flow.Launcher/releases 으로 방문하세요.
-
- 릴리즈 노트
- 사용 팁
- 개발자도구
- 설정 폴더
- 로그 폴더
- 마법사
-
-
- 파일관리자 선택
- 사용하려는 파일관리자를 선택하고 필요한 경우 인수를 추가하세요. 기본 인수는 "%d" 이며 해당 위치에 경로가 입력됩니다. 예를들어 "totalcmd.exe /A c:\windows"와 같은 명령이 필요한 경우, 인수는 /A "%d" 입니다.
- "%f"는 특정 파일의 경로를 나타냅니다. 파일관리자에서 선택한 파일/폴더의 위치를 강조하는 기능에서 사용됩니다. 이 인수는 "파일경로 인수" 항목에서만 사용할 수 있습니다. 파일관리자에 해당 기능이 없거나 잘 모를 경우 "%d" 인수를 사용할 수 있습니다.
- 파일관리자
- 프로필 이름
- 파일관리자 경로
- 폴더경로 인수
- 파일경로 인수
-
-
- 기본 웹 브라우저r
- 기본 설정은 OS의 브라우저 설정을 따릅니다. 별도 설정시 Flow Launcher가 해당 브라우저를 사용합니다.
- 브라우저
- 브라우저 이름
- 브라우저 경로
- 새 창
- 새 탭
- 프라이빗 모드
-
-
- 중요도 변경
- 높은 수를 넣을수록 상위 결과에 표시됩니다. 5를 시도해보세요. 다른 플러그인 보다 결과를 낮춰 표시하고 싶다면, 그보다 낮은 수를 입력하세요.
- 중요도에 올바른 정수를 입력하세요.
-
- 예전 액션 키워드
- 새 액션 키워드
- 취소
- 완료
- 플러그인을 찾을 수 없습니다.
- 새 액션 키워드를 입력하세요.
- 새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요.
- 성공
- 성공적으로 완료했습니다.
- 플러그인을 시작하는데 필요한 액션 키워드를 입력하세요. 액션 키워드를 지정하지 않으려면 *를 사용하세요. 이 경우 키워드를 입력하지 않아도 동작합니다.
-
-
- 커스텀 플러그인 단축키
- 단축키를 지정하여 특정 쿼리를 자동으로 입력할 수 있습니다. 사용하고 싶은 단축키를 눌러 지정한 후, 사용할 쿼리를 입력하세요.
- 미리보기
- 단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요.
- 플러그인 단축키가 유효하지 않습니다.
- 업데이트
-
-
- 단축키를 사용할 수 없습니다.
-
-
- 버전
- 시간
- 수정을 위해 애플리케이션이 어떻게 충돌했는지 알려주세요.
- 보고서 보내기
- 취소
- 일반
- 예외
- 예외 유형
- 소스
- 스택 추적
- 보내는 중
- 보고서를 정상적으로 보냈습니다.
- 보고서를 보내지 못했습니다.
- Flow Launcher에 문제가 발생했습니다.
-
-
- 잠시 기다려주세요...
-
- 새 업데이트 확인 중
- 새 Flow Launcher 버전({0})을 사용할 수 있습니다.
- 이미 가장 최신 버전의 Flow Launcher를 사용중입니다.
- 업데이트 발견
- 업데이트 중...
-
- Flow Launcher가 유저 정보 데이터를 새버전으로 옮길 수 없습니다.
- 프로필 데이터 폴더를 수동으로 {0} 에서 {1}로 옮겨주세요.
-
- 새 업데이트
- 소프트웨어 업데이트를 설치하는 중에 오류가 발생했습니다.
- 업데이트
- 취소
- 업데이트 실패
- Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
- 업데이트를 위해 Flow Launcher를 재시작합니다.
- 아래 파일들이 업데이트됩니다.
- 업데이트 파일
- 업데이트 설명
-
-
-
- 건너뛰기
- Flow Launcher에 오신 것을 환영합니다
- 안녕하세요, Flow Launcher를 처음 실행하시네요!
- 시작하기전에 이 마법사가 간단한 설정을 도와드릴겁니다. 물론 건너 뛰셔도 됩니다. 사용하시는 언어를 선택해주세요.
- PC에서 모든 파일과 프로그램을 검색하고 실행합니다
- 프로그램, 파일, 즐겨찾기, YouTube, Twitter 등 모든 것을 검색하세요. 마우스에 손대지 않고 키보드만으로 모든 것을 얻을 수 있습니다.
- Flow는 아래의 단축키로 실행합니다. 변경하려면 입력창을 선택하고 키보드에서 원하는 단축키를 누릅니다.
- 단축키
- 액션 키워드와 명령어
- Flow Launcher는 플러그인을 통해 웹 검색, 프로그램 실행, 다양한 기능을 실행합니다. 특정 기능은 액션 키워드로 시작하며, 필요한 경우 액션 키워드 없이 사용할 수 있습니다. Flow Launcher에서 아래 쿼리를 사용해 보세요.
- Flow Launcher를 시작합시다
- 끝났습니다. Flow Launcher를 즐겨주세요. 시작하는 단축키를 잊지마세요 :)
-
-
-
- 뒤로/ 콘텍스트 메뉴
- 아이템 이동
- 콘텍스트 메뉴 열기
- 포함된 폴더 열기
- 관리자 권한으로 실행
- 검색 기록
- 콘텍스트 메뉴에서 뒤로 가기
- 선택한 아이템 열기
- 설정창 열기
- 플러그인 데이터 새로고침
-
- 날씨
- 구글 날씨 검색
- > ping 8.8.8.8
- 쉘 명령어
- 블루투스
- 윈도우 블루투스 설정
- 스메
- 스티커 메모
-
-
\ No newline at end of file
+
+
+
+ 단축키 등록 실패: {0}
+ {0}을 실행할 수 없습니다.
+ Flow Launcher 플러그인 파일 형식이 유효하지 않습니다.
+ 이 쿼리의 최상위로 설정
+ 이 쿼리의 최상위 설정 취소
+ 쿼리 실행: {0}
+ 마지막 실행 시간: {0}
+ 열기
+ 설정
+ 정보
+ 종료
+ 닫기
+ 복사하기
+ 잘라내기
+ 붙여넣기
+ 되돌리기
+ 모두 선택
+ 파일
+ 폴더
+ 텍스트
+ 게임 모드
+ 단축키 사용을 일시중단합니다.
+ 창 위치 초기화
+ 검색창 위치 초기화
+
+
+ 설정
+ 일반
+ 포터블 모드
+ 모든 설정이 폴더안에 들어갑니다. USB 드라이브나 클라우드로 사용 가능합니다.
+ 시스템 시작 시 Flow Launcher 실행
+ Error setting launch on startup
+ 포커스 잃으면 Flow Launcher 숨김
+ 새 버전 알림 끄기
+ 검색 창 위치
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ 언어
+ 마지막 쿼리 스타일
+ 쿼리박스를 열었을 때 쿼리 처리 방식
+ 직전 쿼리에 계속 입력
+ 직전 쿼리 내용 선택
+ 직전 쿼리 지우기
+ 표시할 결과 수
+ Ctrl + '+'키와 Ctrl + '-'키로도 빠르게 조정할 수 있습니다
+ 전체화면 모드에서는 단축키 무시
+ 게이머라면 켜는 것을 추천합니다.
+ 기본 파일관리자
+ 폴더를 열 때 사용할 파일관리자를 선택하세요.
+ 기본 웹 브라우저
+ 새 탭, 새 창, 사생활 보호 모드
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ 항상 영어입력 모드에서 시작
+ Flow 시작시 영어 상태에서 입력을 시작합니다.
+ 자동 업데이트
+ 선택
+ 시작 시 Flow Launcher 숨김
+ 트레이 아이콘 숨기기
+ 트레이에서 아이콘을 숨길 경우, 검색창 우클릭으로 설정창을 열 수 있습니다.
+ 쿼리 검색 정밀도
+ 검색 결과에 필요한 최소 매치 점수를 변경합니다.
+ 항상 Pinyin 사용
+ Pinyin을 사용하여 검색할 수 있습니다. Pinyin (병음) 은 로마자 중국어 입력 방식입니다.
+ 항상 미리보기
+ Flow 사용시 항상 미리보기 패널을 열어둡니다. {0} 키를 눌러 프리뷰창을 켜고 끌 수 있습니다.
+ 반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다.
+
+
+ 플러그인 검색
+ Ctrl+F로 플러그인 검색
+ 검색 결과를 찾을 수 없습니다.
+ 다른 검색어를 시도해주세요.
+ 플러그인
+ 플러그인
+ 플러그인 더 찾아보기
+ 켬
+ 끔
+ 액션 키워드 설정
+ 액션 키워드
+ 현재 액션 키워드
+ 새 액션 키워드
+ 액션 키워드 변경
+ 현재 중요도:
+ 새 중요도:
+ 중요도
+ 플러그인 결과 우선 순위 변경
+ 플러그인 폴더
+ 제작자
+ 초기화 시간:
+ 쿼리 시간:
+ 버전
+ 웹사이트
+ 제거
+
+
+
+ 플러그인 스토어
+ 신규 플러그인
+ 최근 업데이트
+ 플러그인
+ 설치됨
+ 새로고침
+ 설치
+ 제거
+ 업데이트
+ 플러그인이 이미 설치되었습니다
+ 새 버전
+ 이 플러그인은 최근 7일 사이 업데이트 되었습니다
+ 새 업데이트 설치 가능
+
+
+
+
+ 테마
+ 외관
+ 테마 갤러리
+ 테마 제작 안내
+ 안녕하세요!
+ 탐색기
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ 프로그램
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ 쿼리 상자 글꼴
+ 결과 항목 글꼴
+ 윈도우 모드
+ 투명도
+ {0} 테마가 존재하지 않습니다. 기본 테마로 변경합니다.
+ {0} 테마 로드에 실패했습니다. 기본 테마로 변경합니다.
+ 테마 폴더
+ 테마 폴더 열기
+ 앱 색상
+ 시스템 기본
+ 밝게
+ 어둡게
+ 소리 효과
+ 검색창을 열 때 작은 소리를 재생합니다.
+ 애니메이션
+ 일부 UI에 애니메이션을 사용합니다.
+ 시계
+ 날짜
+
+
+ 단축키
+ 단축키
+ Flow Launcher 단축키
+ Flow Launcher를 열 때 사용할 단축키를 입력하세요.
+ 미리보기 단축키
+ 미리보기 패널을 켜고 끌 때 사용할 단축키를 입력하세요.
+ 결과 선택 단축키
+ 결과 항목을 선택하는 단축키입니다.
+ 단축키 표시
+ 결과창에서 결과 선택 단축키를 표시합니다.
+ 사용자지정 쿼리 단축키
+ 사용자 지정 쿼리 단축어
+ 내장 단축어
+ 쿼리
+ 단축어
+ 확장
+ 설명
+ 삭제
+ 편집
+ 추가
+ 항목을 선택하세요.
+ {0} 플러그인 단축키를 삭제하시겠습니까?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ 클립보드에서 텍스트 가져오기
+ Get path from active explorer.
+ 그림자 효과
+ 그림자 효과는 GPU를 사용합니다. 컴퓨터 퍼포먼스가 제한적인 경우 사용을 추천하지 않습니다.
+ 창 넓이
+ Ctrl + [ 키와 Ctrl + ] 키로도 빠르게 크기를 조정할 수 있습니다
+ 플루언트 아이콘 사용
+ 결과 및 일부 메뉴에서 플루언트 아이콘을 사용합니다.
+ 사용할 키를 누르세요
+
+
+ HTTP 프록시
+ HTTP 프록시 켜기
+ HTTP 서버
+ 포트
+ 사용자명
+ 패스워드
+ 프록시 테스트
+ 저장
+ 서버를 입력하세요.
+ 포트를 입력하세요.
+ 유효하지 않은 포트 형식
+ 프록시 설정이 저장되었습니다.
+ 프록시 설정 정상
+ 프록시 연결 실패
+
+
+ 정보
+ 웹사이트
+ GitHub
+ 문서
+ 버전
+ 아이콘
+ Flow Launcher를 {0}번 실행했습니다.
+ 업데이트 확인
+ 후원하기
+ 새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.
+ 업데이트 확인을 실패했습니다. api.github.com로의 연결 또는 프록시 설정을 확인해주세요.
+
+ 업데이트 다운로드에 실패했습니다. github-cloud.s3.amazonaws.com의 연결 또는 프록시 설정을 확인해주세요.
+ 수동 다운로드를 하려면 https://github.com/Flow-Launcher/Flow.Launcher/releases 으로 방문하세요.
+
+ 릴리즈 노트
+ 사용 팁
+ 개발자 도구
+ 설정 폴더
+ 로그 폴더
+ 로그 삭제
+ 정말 모든 로그를 삭제하시겠습니까?
+ 마법사
+
+
+ 파일관리자 선택
+ 사용하려는 파일관리자를 선택하고 필요한 경우 인수를 추가하세요. 기본 인수는 "%d" 이며 해당 위치에 경로가 입력됩니다. 예를들어 "totalcmd.exe /A c:\windows"와 같은 명령이 필요한 경우, 인수는 /A "%d" 입니다.
+ "%f"는 특정 파일의 경로를 나타냅니다. 파일관리자에서 선택한 파일/폴더의 위치를 강조하는 기능에서 사용됩니다. 이 인수는 "파일경로 인수" 항목에서만 사용할 수 있습니다. 파일관리자에 해당 기능이 없거나 잘 모를 경우 "%d" 인수를 사용할 수 있습니다.
+ 파일관리자
+ 프로필 이름
+ 파일관리자 경로
+ 폴더경로 인수
+ 파일경로 인수
+
+
+ 기본 웹 브라우저r
+ 기본 설정은 OS의 기본 브라우저 설정을 따릅니다. 특정 브라우저를 지정할 경우, Flow는 해당 브라우저를 사용합니다.
+ 브라우저
+ 브라우저 이름
+ 브라우저 경로
+ 새 창
+ 새 탭
+ 사생활 보호 모드
+
+
+ 중요도 변경
+ 높은 수를 넣을수록 상위 결과에 표시됩니다. 5를 시도해보세요. 다른 플러그인 보다 결과를 낮춰 표시하고 싶다면, 그보다 낮은 수를 입력하세요.
+ 중요도에 올바른 정수를 입력하세요.
+
+
+ 예전 액션 키워드
+ 새 액션 키워드
+ 취소
+ 완료
+ 플러그인을 찾을 수 없습니다.
+ 새 액션 키워드를 입력하세요.
+ 새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요.
+ 성공
+ 성공적으로 완료했습니다.
+ 플러그인을 시작하는데 필요한 액션 키워드를 입력하세요. 액션 키워드를 지정하지 않으려면 *를 사용하세요. 이 경우 키워드를 입력하지 않아도 동작합니다.
+
+
+ 사용자지정 쿼리 단축키
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ 미리보기
+ 단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요.
+ 플러그인 단축키가 유효하지 않습니다.
+ 업데이트
+
+
+ 사용자 지정 쿼리 단축어
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ 단축키를 사용할 수 없습니다.
+
+
+ 버전
+ 시간
+ 수정을 위해 애플리케이션이 어떻게 충돌했는지 알려주세요.
+ 보고서 보내기
+ 취소
+ 일반
+ 예외
+ 예외 유형
+ 소스
+ 스택 추적
+ 보내는 중
+ 보고서를 정상적으로 보냈습니다.
+ 보고서를 보내지 못했습니다.
+ Flow Launcher에 문제가 발생했습니다.
+
+
+ 잠시 기다려주세요...
+
+
+ 새 업데이트 확인 중
+ 이미 가장 최신 버전의 Flow Launcher를 사용중입니다.
+ 업데이트 발견
+ 업데이트 중...
+
+ Flow Launcher가 유저 정보 데이터를 새버전으로 옮길 수 없습니다.
+ 프로필 데이터 폴더를 수동으로 {0} 에서 {1}로 옮겨주세요.
+
+ 새 업데이트
+ 새 Flow Launcher 버전({0})을 사용할 수 있습니다.
+ 소프트웨어 업데이트를 설치하는 중에 오류가 발생했습니다.
+ 업데이트
+ 취소
+ 업데이트 실패
+ 연결을 확인하고 프록시 설정을 github-cloud.s3.amazonaws.com으로 업데이트해 보십시오.
+ 업데이트를 위해 Flow Launcher를 재시작합니다.
+ 아래 파일들이 업데이트됩니다.
+ 업데이트 파일
+ 업데이트 설명
+
+
+ 건너뛰기
+ Flow Launcher에 오신 것을 환영합니다
+ 안녕하세요, Flow Launcher를 처음 실행하시네요!
+ 시작하기전에 이 마법사가 간단한 설정을 도와드릴겁니다. 물론 건너 뛰셔도 됩니다. 사용하시는 언어를 선택해주세요.
+ PC에서 모든 파일과 프로그램을 검색하고 실행합니다
+ 프로그램, 파일, 즐겨찾기, YouTube, Twitter 등 모든 것을 검색하세요. 마우스에 손대지 않고 키보드만으로 모든 것을 얻을 수 있습니다.
+ Flow는 아래의 단축키로 실행합니다. 변경하려면 입력창을 선택하고 키보드에서 원하는 단축키를 누릅니다.
+ 단축키
+ 액션 키워드와 명령어
+ Flow Launcher는 플러그인을 통해 웹 검색, 프로그램 실행, 다양한 기능을 실행합니다. 특정 기능은 액션 키워드로 시작하며, 필요한 경우 액션 키워드 없이 사용할 수 있습니다. Flow Launcher에서 아래 쿼리를 사용해 보세요.
+ Flow Launcher를 시작합시다
+ 끝났습니다. Flow Launcher를 즐겨주세요. 시작하는 단축키를 잊지마세요 :)
+
+
+
+ 뒤로/ 콘텍스트 메뉴
+ 아이템 이동
+ 콘텍스트 메뉴 열기
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ 검색 기록
+ 콘텍스트 메뉴에서 뒤로 가기
+ 자동완성
+ 선택한 아이템 열기
+ 설정창 열기
+ 플러그인 데이터 새로고침
+
+ 날씨
+ 구글 날씨 검색
+ > ping 8.8.8.8
+ 쉘 명령어
+ s 블루투스
+ 윈도우 블루투스 설정
+ 스메
+ 스티커 메모
+
+
diff --git a/Flow.Launcher/Languages/nb-NO.xaml b/Flow.Launcher/Languages/nb-NO.xaml
index 859ec20a0..4391dc23a 100644
--- a/Flow.Launcher/Languages/nb-NO.xaml
+++ b/Flow.Launcher/Languages/nb-NO.xaml
@@ -1,7 +1,8 @@
-
-
+
+
Kunne ikke registrere hurtigtast: {0}
Kunne ikke starte {0}
Ugyldig filformat for Flow Launcher-utvidelse
@@ -14,7 +15,7 @@
Om
Avslutt
-
+
Flow Launcher-innstillinger
Generelt
Start Flow Launcher ved systemstart
@@ -28,13 +29,13 @@
Tøm siste spørring
Maks antall resultater vist
Ignorer hurtigtaster i fullskjermsmodus
- Python-mappe
Oppdater automatisk
- Velg
+ Velg
Skjul Flow Launcher ved oppstart
-
+
Utvidelse
+ Utvidelse
Finn flere utvidelser
Deaktiver
Handlingsnøkkelord
@@ -43,16 +44,18 @@
Oppstartstid:
Spørringstid:
-
+
Tema
+ Appearance
Finn flere temaer
Font for spørringsboks
Font for resultat
Vindusmodus
Gjennomsiktighet
-
+
Hurtigtast
+ Hurtigtast
Flow Launcher-hurtigtast
Åpne resultatmodifiserere
Egendefinerd spørringshurtigtast
@@ -63,7 +66,7 @@
Vennligst velg et element
Er du sikker på at du vil slette utvidelserhurtigtasten for {0}?
-
+
HTTP-proxy
Aktiver HTTP-proxy
HTTP-server
@@ -79,7 +82,7 @@
Proxy konfigurert riktig
Proxy-tilkobling feilet
-
+
Om
Netside
Versjon
@@ -88,12 +91,12 @@
Ny versjon {0} er tilgjengelig, vennligst start Flow Launcher på nytt.
Oppdateringssjekk feilet, vennligst sjekk tilkoblingen og proxy-innstillene for api.github.com.
- Nedlastning av oppdateringer feilet, vennligst sjekk tilkoblingen og proxy-innstillene for github-cloud.s3.amazonaws.com,
+ Nedlastning av oppdateringer feilet, vennligst sjekk tilkoblingen og proxy-innstillene for github-cloud.s3.amazonaws.com,
eller gå til https://github.com/Flow-Launcher/Flow.Launcher/releases for å laste ned oppdateringer manuelt.
Versjonsmerknader:
-
+
Gammelt handlingsnøkkelord
Nytt handlingsnøkkelord
Avbryt
@@ -104,16 +107,16 @@
Vellykket
Bruk * hvis du ikke ønsker å angi et handlingsnøkkelord
-
+
Forhåndsvis
Hurtigtasten er ikke tilgjengelig, vennligst velg en ny hurtigtast
Ugyldig hurtigtast for utvidelse
Oppdater
-
+
Hurtigtast utilgjengelig
-
+
Versjon
Tid
Fortell oss hvordan programmet krasjet, så vi kan fikse det
@@ -129,7 +132,7 @@
Kunne ikke sende rapport
Flow Launcher møtte på en feil
-
+
Versjon {0} av Flow Launcher er nå tilgjengelig
En feil oppstod under installasjon av programvareoppdateringer
Oppdater
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
new file mode 100644
index 000000000..754172281
--- /dev/null
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -0,0 +1,367 @@
+
+
+
+ Failed to register hotkey: {0}
+ Could not start {0}
+ Invalid Flow Launcher plugin file format
+ Set as topmost in this query
+ Cancel topmost in this query
+ Execute query: {0}
+ Last execution time: {0}
+ Open
+ Settings
+ About
+ Exit
+ Close
+ Copy
+ Cut
+ Paste
+ Undo
+ Select All
+ File
+ Folder
+ Text
+ Game Mode
+ Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
+
+
+ Settings
+ General
+ Portable Mode
+ Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Start Flow Launcher on system startup
+ Error setting launch on startup
+ Hide Flow Launcher when focus is lost
+ Do not show new version notifications
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Language
+ Last Query Style
+ Show/Hide previous results when Flow Launcher is reactivated.
+ Preserve Last Query
+ Select last Query
+ Empty last Query
+ Maximum results shown
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignore hotkeys in fullscreen mode
+ Disable Flow Launcher activation when a full screen application is active (Recommended for games).
+ Default File Manager
+ Select the file manager to use when opening the folder.
+ Default Web Browser
+ Setting for New Tab, New Window, Private Mode.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Auto Update
+ Select
+ Hide Flow Launcher on startup
+ Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Find more plugins
+ On
+ Off
+ Action keyword Setting
+ Action keyword
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Current Priority
+ New Priority
+ Priority
+ Change Plugin Results Priority
+ Plugin Directory
+ by
+ Init time:
+ Query time:
+ Version
+ Website
+ Uninstall
+
+
+
+ Plugin Store
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Refresh
+ Install
+ Uninstall
+ Update
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Theme
+ Appearance
+ Theme Gallery
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Query Box Font
+ Result Item Font
+ Window Mode
+ Opacity
+ Theme {0} not exists, fallback to default theme
+ Fail to load theme {0}, fallback to default theme
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Animation
+ Use Animation in UI
+ Clock
+ Date
+
+
+ Hotkey
+ Hotkeys
+ Flow Launcher Hotkey
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Open Result Modifier Key
+ Select a modifier key to open selected result via keyboard.
+ Show Hotkey
+ Show result selection hotkey with results.
+ Custom Query Hotkeys
+ Custom Query Shortcuts
+ Built-in Shortcuts
+ Query
+ Shortcut
+ Expansion
+ Description
+ Delete
+ Edit
+ Add
+ Please select an item
+ Are you sure you want to delete {0} plugin hotkey?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP Proxy
+ Enable HTTP Proxy
+ HTTP Server
+ Port
+ User Name
+ Password
+ Test Proxy
+ Save
+ Server field can't be empty
+ Port field can't be empty
+ Invalid port format
+ Proxy configuration saved successfully
+ Proxy configured correctly
+ Proxy connection failed
+
+
+ About
+ Website
+ GitHub
+ Docs
+ Version
+ Icons
+ You have activated Flow Launcher {0} times
+ Check for Updates
+ Become A Sponsor
+ New version {0} is available, would you like to restart Flow Launcher to use the update?
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Release Notes
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Old Action Keyword
+ New Action Keyword
+ Cancel
+ Done
+ Can't find specified plugin
+ New Action Keyword can't be empty
+ This new Action Keyword is already assigned to another plugin, please choose a different one
+ Success
+ Completed successfully
+ Enter the action keyword you like to use to start the plugin. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords.
+
+
+ Custom Query Hotkey
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Preview
+ Hotkey is unavailable, please select a new hotkey
+ Invalid plugin hotkey
+ Update
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Hotkey Unavailable
+
+
+ Version
+ Time
+ Please tell us how application crashed so we can fix it
+ Send Report
+ Cancel
+ General
+ Exceptions
+ Exception Type
+ Source
+ Stack Trace
+ Sending
+ Report sent successfully
+ Failed to send report
+ Flow Launcher got an error
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ New Flow Launcher release {0} is now available
+ An error occurred while trying to install software updates
+ Update
+ Cancel
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ This upgrade will restart Flow Launcher
+ Following files will be updated
+ Update files
+ Update description
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 822af21bf..9defd6d9f 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -1,133 +1,367 @@
-
-
- Sneltoets registratie: {0} mislukt
- Kan {0} niet starten
- Ongeldige Flow Launcher plugin bestandsextensie
- Stel in als hoogste in deze query
- Annuleer hoogste in deze query
- Executeer query: {0}
- Laatste executie tijd: {0}
- Open
- Instellingen
- About
- Afsluiten
-
-
- Flow Launcher Instellingen
- Algemeen
- Start Flow Launcher als systeem opstart
- Verberg Flow Launcher als focus verloren is
- Laat geen nieuwe versie notificaties zien
- Herinner laatste opstart locatie
- Taal
- Laat maximale resultaten zien
- Negeer sneltoetsen in fullscreen mode
- Python map
- Automatische Update
- Selecteer
- Verberg Flow Launcher als systeem opstart
-
-
- Plugin
- Zoek meer plugins
- Disable
- Action terfwoorden
- Plugin map
- Auteur
- Init tijd:
- Query tijd:
-
-
- Thema
- Zoek meer thema´s
- Query Box lettertype
- Resultaat Item lettertype
- Window Mode
- Ondoorzichtigheid
-
-
- Sneltoets
- Flow Launcher Sneltoets
- Open resultaatmodificatoren
- Custom Query Sneltoets
- Sneltoets weergeven
- Verwijder
- Bewerken
- Toevoegen
- Selecteer een item
- Weet u zeker dat je {0} plugin sneltoets wilt verwijderen?
-
-
- HTTP Proxy
- Enable HTTP Proxy
- HTTP Server
- Poort
- Gebruikersnaam
- Wachtwoord
- Test Proxy
- Opslaan
- Server moet ingevuld worden
- Poort moet ingevuld worden
- Ongeldige poort formaat
- Proxy succesvol opgeslagen
- Proxy correct geconfigureerd
- Proxy connectie mislukt
-
-
- Over
- Website
- Versie
- U heeft Flow Launcher {0} keer opgestart
- Zoek naar Updates
- Nieuwe versie {0} beschikbaar, start Flow Launcher opnieuw op
- Release Notes:
-
-
- Oude actie sneltoets
- Nieuwe actie sneltoets
- Annuleer
- Klaar
- Kan plugin niet vinden
- Nieuwe actie sneltoets moet ingevuld worden
- Nieuwe actie sneltoets is toegewezen aan een andere plugin, wijs een nieuwe actie sneltoets aan
- Succesvol
- Gebruik * wanneer je geen nieuwe actie sneltoets wilt specificeren
-
-
- Voorbeeld
- Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoets
- Ongeldige plugin sneltoets
- Update
-
-
- Sneltoets niet beschikbaar
-
-
- Versie
- Tijd
- Vertel ons hoe de applicatie is gecrashed, zodat wij de applicatie kunnen verbeteren
- Verstuur Rapport
- Annuleer
- Algemeen
- Uitzonderingen
- Uitzondering Type
- Bron
- Stack Opzoeken
- Versturen
- Rapport succesvol
- Rapport mislukt
- Flow Launcher heeft een error
-
-
- Nieuwe Flow Launcher release {0} nu beschikbaar
- Een error is voorgekomen tijdens het installeren van de update
- Update
- Annuleer
- Deze upgrade zal Flow Launcher opnieuw opstarten
- Volgende bestanden zullen worden geüpdatet
- Update bestanden
- Update beschrijving
-
-
+
+
+
+ Sneltoets registratie: {0} mislukt
+ Kan {0} niet starten
+ Ongeldige Flow Launcher plugin bestandsextensie
+ Stel in als hoogste in deze query
+ Annuleer hoogste in deze query
+ Executeer query: {0}
+ Laatste executie tijd: {0}
+ Openen
+ Instellingen
+ Over
+ Afsluiten
+ Sluiten
+ Kopiëren
+ Knippen
+ Plakken
+ Ongedaan maken
+ Alles selecteren
+ Bestand
+ Map
+ Tekst
+ Spelmodus
+ Stop het gebruik van Sneltoetsen.
+ Positie resetten
+ Positie zoekvenster resetten
+
+
+ Instellingen
+ Algemeen
+ Draagbare Modus
+ Alle instellingen en gebruikersgegevens opslaan in één map (Nuttig bij het gebruik van verwijderbare schijven of cloud services).
+ Start Flow Launcher als systeem opstart
+ Fout bij het instellen van uitvoeren bij opstarten
+ Verberg Flow Launcher als focus verloren is
+ Laat geen nieuwe versie notificaties zien
+ Positie Zoekvenster
+ Laatste Positie Onthouden
+ Monitor met Muiscursor
+ Monitor met Gefocust Venster
+ Primaire Monitor
+ Aangepaste Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Taal
+ Laatste Query Style
+ Toon/Verberg vorige resultaten wanneer Flow Launcher wordt gereactiveerd.
+ Behoud laatste zoekopdracht
+ Selecteer laatste zoekopdracht
+ Laatste zoekopdracht verwijderen
+ Laat maximale resultaten zien
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Negeer sneltoetsen in fullscreen mode
+ De activatie van Flow Launcher uitschakelen als er een applicatie actief is die zich in een volledig scherm bevind (Aanbevolen voor spellen).
+ Standaard Bestandsbeheerder
+ Selecteer de bestandsbeheerder voor het openen van de map.
+ Standaard webbrowser
+ Instelling voor Nieuw tabblad, Nieuw Venster, Privémodus.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Automatische Update
+ Selecteer
+ Verberg Flow Launcher als systeem opstart
+ Systeemvakpictogram verbergen
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Zoekopdracht nauwkeurigheid
+ Wijzigt de minimale overeenkomst-score die vereist is voor resultaten.
+ Zou Pinyin moeten gebruiken
+ Zorgt ervoor dat Pinyin gebruikt kan worden om te zoeken. Pinyin is het standaard systeem van geromaniseerde spelling voor het vertalen van Chinees.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Schaduw effect is niet toegestaan omdat het huidige thema een vervagingseffect heeft
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Zoek meer plugins
+ Aan
+ Disable
+ Actie sneltoets instelling
+ Action terfwoorden
+ Huidige actie sneltoets
+ Nieuw actie sneltoets
+ Wijzig actie-sneltoets
+ Huidige Prioriteit
+ Nieuwe Prioriteit
+ Prioriteit
+ Change Plugin Results Priority
+ Plugin map
+ door
+ Init tijd:
+ Query tijd:
+ Versie
+ Website
+ Uninstall
+
+
+
+ Plugin Winkel
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Vernieuwen
+ Install
+ Uninstall
+ Update
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Thema
+ Appearance
+ Zoek meer thema´s
+ Hoe maak je een thema
+ Hallo daar
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Query Box lettertype
+ Resultaat Item lettertype
+ Venster Modus
+ Ondoorzichtigheid
+ Thema {0} bestaat niet, terugvallen op het standaardthema
+ Laden van thema {0} is mislukt, terugvallen op het standaard thema
+ Thema Map
+ Open Thema Map
+ Kleurenschema
+ Systeemstandaard
+ Licht
+ Donker
+ Geluidseffect
+ Een klein geluid afspelen wanneer het zoekvenster wordt geopend
+ Animatie
+ Animatie gebruiken in UI
+ Clock
+ Date
+
+
+ Sneltoets
+ Sneltoets
+ Flow Launcher Sneltoets
+ Voer snelkoppeling in om Flow Launcher te tonen/verbergen.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Open resultaatmodificatoren
+ Kies een aanpassingstoets om het geselecteerde resultaat te openen via het toetsenbord.
+ Sneltoets weergeven
+ Show result selection hotkey with results.
+ Custom Query Sneltoets
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Verwijder
+ Bewerken
+ Toevoegen
+ Selecteer een item
+ Weet u zeker dat je {0} plugin sneltoets wilt verwijderen?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP Proxy
+ Enable HTTP Proxy
+ HTTP Server
+ Poort
+ Gebruikersnaam
+ Wachtwoord
+ Test Proxy
+ Opslaan
+ Server moet ingevuld worden
+ Poort moet ingevuld worden
+ Ongeldige poort formaat
+ Proxy succesvol opgeslagen
+ Proxy correct geconfigureerd
+ Proxy connectie mislukt
+
+
+ Over
+ Website
+ GitHub
+ Docs
+ Versie
+ Icons
+ U heeft Flow Launcher {0} keer opgestart
+ Zoek naar Updates
+ Become A Sponsor
+ Nieuwe versie {0} beschikbaar, start Flow Launcher opnieuw op
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Release Notes
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Oude actie sneltoets
+ Nieuwe actie sneltoets
+ Annuleer
+ Klaar
+ Kan plugin niet vinden
+ Nieuwe actie sneltoets moet ingevuld worden
+ Nieuwe actie sneltoets is toegewezen aan een andere plugin, wijs een nieuwe actie sneltoets aan
+ Succesvol
+ Completed successfully
+ Gebruik * wanneer je geen nieuwe actie sneltoets wilt specificeren
+
+
+ Custom Query Sneltoets
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Voorbeeld
+ Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoets
+ Ongeldige plugin sneltoets
+ Update
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Sneltoets niet beschikbaar
+
+
+ Versie
+ Tijd
+ Vertel ons hoe de applicatie is gecrashed, zodat wij de applicatie kunnen verbeteren
+ Verstuur Rapport
+ Annuleer
+ Algemeen
+ Uitzonderingen
+ Uitzondering Type
+ Bron
+ Stack Opzoeken
+ Versturen
+ Rapport succesvol verzonden
+ Verzenden van rapport mislukt
+ Flow Launcher heeft een error
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Nieuwe Flow Launcher release {0} nu beschikbaar
+ Een error is voorgekomen tijdens het installeren van de update
+ Update
+ Annuleer
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Deze upgrade zal Flow Launcher opnieuw opstarten
+ Volgende bestanden zullen worden geüpdatet
+ Update bestanden
+ Update beschrijving
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index a8c423de1..991d7119a 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -1,133 +1,367 @@
-
-
- Nie udało się ustawić skrótu klawiszowego: {0}
- Nie udało się uruchomić: {0}
- Niepoprawny format pliku wtyczki
- Ustaw jako najwyższy wynik dla tego zapytania
- Usuń ten najwyższy wynik dla tego zapytania
- Wyszukaj: {0}
- Ostatni czas wykonywania: {0}
- Otwórz
- Ustawienia
- O programie
- Wyjdź
-
-
- Ustawienia Flow Launcher
- Ogólne
- Uruchamiaj Flow Launcher przy starcie systemu
- Ukryj okno Flow Launcher kiedy przestanie ono być aktywne
- Nie pokazuj powiadomienia o nowej wersji
- Zapamiętaj ostatnią pozycję okna
- Język
- Maksymalna liczba wyników
- Ignoruj skróty klawiszowe w trybie pełnego ekranu
- Folder biblioteki Python
- Automatyczne aktualizacje
- Wybierz
- Uruchamiaj Flow Launcher zminimalizowany
-
-
- Wtyczki
- Znajdź więcej wtyczek
- Wyłącz
- Wyzwalacze
- Folder wtyczki
- Autor
- Czas ładowania:
- Czas zapytania:
-
-
- Skórka
- Znajdź więcej skórek
- Czcionka okna zapytania
- Czcionka okna wyników
- Tryb w oknie
- Przeźroczystość
-
-
- Skrót klawiszowy
- Skrót klawiszowy Flow Launcher
- Modyfikatory klawiszów otwierających wyniki
- Skrót klawiszowy niestandardowych zapytań
- Pokaż skrót klawiszowy
- Usuń
- Edytuj
- Dodaj
- Musisz coś wybrać
- Czy jesteś pewien że chcesz usunąć skrót klawiszowy {0} wtyczki?
-
-
- Serwer proxy HTTP
- Używaj HTTP proxy
- HTTP Serwer
- Port
- Nazwa użytkownika
- Hasło
- Sprawdź proxy
- Zapisz
- Nazwa serwera nie może być pusta
- Numer portu nie może być pusty
- Nieprawidłowy format numeru portu
- Ustawienia proxy zostały zapisane
- Proxy zostało skonfigurowane poprawnie
- Nie udało się połączyć z serwerem proxy
-
-
- O programie
- Strona internetowa
- Wersja
- Uaktywniłeś Flow Launcher {0} razy
- Szukaj aktualizacji
- Nowa wersja {0} jest dostępna, uruchom ponownie Flow Launcher
- Zmiany:
-
-
- Stary wyzwalacz
- Nowy wyzwalacz
- Anuluj
- Zapisz
- Nie można odnaleźć podanej wtyczki
- Nowy wyzwalacz nie może być pusty
- Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.
- Sukces
- Użyj * jeżeli nie chcesz podawać wyzwalacza
-
-
- Podgląd
- Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy
- Niepoprawny skrót klawiszowy
- Aktualizuj
-
-
- Niepoprawny skrót klawiszowy
-
-
- Wersja
- Czas
- Proszę powiedz nam co się stało zanim wystąpił błąd dzięki czemu będziemy mogli go naprawić (tylko po angielsku)
- Wyślij raport błędu
- Anuluj
- Ogólne
- Wyjątki
- Typ wyjątku
- Źródło
- Stos wywołań
- Wysyłam raport...
- Raport wysłany pomyślnie
- Nie udało się wysłać raportu
- W programie Flow Launcher wystąpił błąd
-
-
- Nowa wersja Flow Launcher {0} jest dostępna
- Wystąpił błąd podczas instalowania aktualizacji programu
- Aktualizuj
- Anuluj
- Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany
- Następujące pliki zostaną zaktualizowane
- Aktualizuj pliki
- Opis aktualizacji
-
-
\ No newline at end of file
+
+
+
+ Nie udało się ustawić skrótu klawiszowego: {0}
+ Nie udało się uruchomić: {0}
+ Niepoprawny format pliku wtyczki
+ Ustaw jako najwyższy wynik dla tego zapytania
+ Usuń ten najwyższy wynik dla tego zapytania
+ Wyszukaj: {0}
+ Ostatni czas wykonywania: {0}
+ Otwórz
+ Ustawienia
+ O programie
+ Wyjdź
+ Zamknij
+ Kopiuj
+ Wytnij
+ Wklej
+ Cofnij
+ Zaznacz wszystko
+ Plik
+ Folder
+ Text
+ Tryb grania
+ Wstrzymaj używanie skrótów.
+ Position Reset
+ Reset search window position
+
+
+ Ustawienia
+ Ogólne
+ Tryb przenośny
+ Przechowuj wszystkie ustawienia i dane użytkownika w jednym folderze (Przydatne, gdy używane na dyskach wymiennych lub usługach chmurowych).
+ Uruchamiaj Flow Launcher przy starcie systemu
+ Error setting launch on startup
+ Ukryj okno Flow Launcher kiedy przestanie ono być aktywne
+ Nie pokazuj powiadomienia o nowej wersji
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Język
+ Last Query Style
+ Show/Hide previous results when Flow Launcher is reactivated.
+ Preserve Last Query
+ Select last Query
+ Empty last Query
+ Maksymalna liczba wyników
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignoruj skróty klawiszowe w trybie pełnego ekranu
+ Wyłącz aktywowanie Flow Launcher, gdy uruchomiona jest aplikacja pełnoekranowa (Zalecane dla gier).
+ Domyślny menedżer plików
+ Wybierz menedżer plików używany do otwierania folderów.
+ Domyślna przeglądarka
+ Ustawienie dla nowej karty, nowego okna i trybu prywatnego.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Automatyczne aktualizacje
+ Wybierz
+ Uruchamiaj Flow Launcher zminimalizowany
+ Ukryj ikonę zasobnika
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Szukaj wtyczek
+ Ctrl+F aby wyszukać wtyczki
+ No results found
+ Please try a different search.
+ Plugin
+ Wtyczki
+ Znajdź więcej wtyczek
+ On
+ Wyłącz
+ Action keyword Setting
+ Wyzwalacze
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Current Priority
+ New Priority
+ Priority
+ Change Plugin Results Priority
+ Folder wtyczki
+ by
+ Czas ładowania:
+ Czas zapytania:
+ Wersja
+ Strona
+ Odinstalowywanie
+
+
+
+ Sklep z wtyczkami
+ New Release
+ Recently Updated
+ Wtyczki
+ Installed
+ Refresh
+ Install
+ Odinstalowywanie
+ Aktualizuj
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Skórka
+ Appearance
+ Znajdź więcej skórek
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Programy
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Czcionka okna zapytania
+ Czcionka okna wyników
+ Tryb w oknie
+ Przeźroczystość
+ Theme {0} not exists, fallback to default theme
+ Fail to load theme {0}, fallback to default theme
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Animation
+ Use Animation in UI
+ Clock
+ Date
+
+
+ Skrót klawiszowy
+ Skrót klawiszowy
+ Skrót klawiszowy Flow Launcher
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Modyfikatory klawiszów otwierających wyniki
+ Select a modifier key to open selected result via keyboard.
+ Pokaż skrót klawiszowy
+ Show result selection hotkey with results.
+ Skrót klawiszowy niestandardowych zapytań
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Opis
+ Usuń
+ Edytuj
+ Dodaj
+ Musisz coś wybrać
+ Czy jesteś pewien że chcesz usunąć skrót klawiszowy {0} wtyczki?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ Serwer proxy HTTP
+ Używaj HTTP proxy
+ HTTP Serwer
+ Port
+ Nazwa użytkownika
+ Hasło
+ Sprawdź proxy
+ Zapisz
+ Nazwa serwera nie może być pusta
+ Numer portu nie może być pusty
+ Nieprawidłowy format numeru portu
+ Ustawienia proxy zostały zapisane
+ Proxy zostało skonfigurowane poprawnie
+ Nie udało się połączyć z serwerem proxy
+
+
+ O programie
+ Website
+ GitHub
+ Docs
+ Wersja
+ Icons
+ Uaktywniłeś Flow Launcher {0} razy
+ Szukaj aktualizacji
+ Become A Sponsor
+ Nowa wersja {0} jest dostępna, uruchom ponownie Flow Launcher
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Zmiany
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Domyślna przeglądarka
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Stary wyzwalacz
+ Nowy wyzwalacz
+ Anuluj
+ Zapisz
+ Nie można odnaleźć podanej wtyczki
+ Nowy wyzwalacz nie może być pusty
+ Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.
+ Sukces
+ Completed successfully
+ Użyj * jeżeli nie chcesz podawać wyzwalacza
+
+
+ Skrót klawiszowy niestandardowych zapyta
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Podgląd
+ Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy
+ Niepoprawny skrót klawiszowy
+ Aktualizuj
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Niepoprawny skrót klawiszowy
+
+
+ Wersja
+ Czas
+ Proszę powiedz nam co się stało zanim wystąpił błąd dzięki czemu będziemy mogli go naprawić (tylko po angielsku)
+ Wyślij raport błędu
+ Anuluj
+ Ogólne
+ Wyjątki
+ Typ wyjątku
+ Źródło
+ Stos wywołań
+ Wysyłam raport...
+ Raport wysłany pomyślnie
+ Nie udało się wysłać raportu
+ W programie Flow Launcher wystąpił błąd
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Nowa wersja Flow Launcher {0} jest dostępna
+ Wystąpił błąd podczas instalowania aktualizacji programu
+ Aktualizuj
+ Anuluj
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany
+ Następujące pliki zostaną zaktualizowane
+ Aktualizuj pliki
+ Opis aktualizacji
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index a4dfe446c..f68068f22 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -1,142 +1,367 @@
-
-
- Falha ao registrar atalho: {0}
- Não foi possível iniciar {0}
- Formato de plugin Flow Launcher inválido
- Tornar a principal nessa consulta
- Cancelar a principal nessa consulta
- Executar consulta: {0}
- Última execução: {0}
- Abrir
- Configurações
- Sobre
- Sair
-
-
- Configurações do Flow Launcher
- Geral
- Iniciar Flow Launcher com inicialização do sistema
- Esconder Flow Launcher quando foco for perdido
- Não mostrar notificações de novas versões
- Lembrar última localização de lançamento
- Idioma
- Estilo da Última Consulta
- Preservar Última Consulta
- Selecionar última consulta
- Limpar última consulta
- Máximo de resultados mostrados
- Ignorar atalhos em tela cheia
- Diretório Python
- Atualizar Automaticamente
- Selecionar
- Esconder Flow Launcher na inicialização
-
-
- Plugin
- Encontrar mais plugins
- Desabilitar
- Palavras-chave de ação
- Diretório de Plugins
- Autor
- Tempo de inicialização:
- Tempo de consulta:
-
-
- Tema
- Ver mais temas
- Fonte da caixa de Consulta
- Fonte do Resultado
- Modo Janela
- Opacidade
-
-
- Atalho
- Atalho do Flow Launcher
- Modificadores de resultado aberto
- Atalho de Consulta Personalizada
- Mostrar tecla de atalho
- Apagar
- Editar
- Adicionar
- Por favor selecione um item
- Tem cereza de que deseja deletar o atalho {0} do plugin?
-
-
- Proxy HTTP
- Habilitar Proxy HTTP
- Servidor HTTP
- Porta
- Usuário
- Senha
- Testar Proxy
- Salvar
- O campo de servidor não pode ser vazio
- O campo de porta não pode ser vazio
- Formato de porta inválido
- Configuração de proxy salva com sucesso
- Proxy configurado corretamente
- Conexão por proxy falhou
-
-
- Sobre
- Website
- Versão
- Você ativou o Flow Launcher {0} vezes
- Procurar atualizações
- A nova versão {0} está disponível, por favor reinicie o Flow Launcher.
- Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.
-
- Falha ao baixar atualizações, confira sua conexão e configuração de proxy para github-cloud.s3.amazonaws.com,
- ou acesse https://github.com/Flow-Launcher/Flow.Launcher/releases para baixar manualmente.
-
- Notas de Versão:
-
-
- Antiga palavra-chave da ação
- Nova palavra-chave da ação
- Cancelar
- Finalizado
- Não foi possível encontrar o plugin especificado
- A nova palavra-chave da ação não pode ser vazia
- A nova palavra-chave da ação já foi atribuída a outro plugin, por favor tente outra
- Sucesso
- Use * se não quiser especificar uma palavra-chave de ação
-
-
- Prévia
- Atalho indisponível, escolha outro
- Atalho de plugin inválido
- Atualizar
-
-
- Atalho indisponível
-
-
- Versão
- Horário
- Por favor, conte como a aplicação parou de funcionar para que possamos consertar
- Enviar Relatório
- Cancelar
- Geral
- Exceções
- Tipo de Exceção
- Fonte
- Rastreamento de pilha
- Enviando
- Relatório enviado com sucesso
- Falha ao enviar relatório
- Flow Launcher apresentou um erro
-
-
- A nova versão {0} do Flow Launcher agora está disponível
- Ocorreu um erro ao tentar instalar atualizações do progama
- Atualizar
- Cancelar
- Essa atualização reiniciará o Flow Launcher
- Os seguintes arquivos serão atualizados
- Atualizar arquivos
- Atualizar descrição
-
-
\ No newline at end of file
+
+
+
+ Falha ao registrar atalho: {0}
+ Não foi possível iniciar {0}
+ Formato de plugin Flow Launcher inválido
+ Tornar a principal nessa consulta
+ Cancelar a principal nessa consulta
+ Executar consulta: {0}
+ Última execução: {0}
+ Abrir
+ Configurações
+ Sobre
+ Sair
+ Fechar
+ Copiar
+ Cortar
+ Colar
+ Undo
+ Select All
+ File
+ Pasta
+ Texto
+ Modo Gamer
+ Suspender o uso de Teclas de Atalho.
+ Position Reset
+ Reset search window position
+
+
+ Configurações
+ Geral
+ Modo Portátil
+ Armazene todas as configurações e dados do usuário em uma pasta (útil quando usado com unidades removíveis ou serviços em nuvem).
+ Iniciar Flow Launcher com inicialização do sistema
+ Error setting launch on startup
+ Esconder Flow Launcher quando foco for perdido
+ Não mostrar notificações de novas versões
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Idioma
+ Estilo da Última Consulta
+ Mostrar/ocultar resultados anteriores quando o Lançador de Fluxos é reativado.
+ Preservar Última Consulta
+ Selecionar última consulta
+ Limpar última consulta
+ Máximo de resultados mostrados
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignorar atalhos em tela cheia
+ Desativar o Flow Launcher quando um aplicativo em tela cheia estiver ativado (recomendado para jogos).
+ Gerenciador de Arquivos Padrões
+ Selecione o gerenciador de arquivos para usar ao abrir a pasta.
+ Navegador da Web Padrão
+ Configuração para Nova Aba, Nova Janela, Modo Privado.
+ Caminho do Python
+ Caminho do Node.js
+ Selecione o executável do Node.js
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Atualizar Automaticamente
+ Selecionar
+ Esconder Flow Launcher na inicialização
+ Ocultar ícone da bandeja
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativado
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ Nenhum resultado encontrado
+ Please try a different search.
+ Plugin
+ Plugins
+ Encontrar mais plugins
+ Ativado
+ Desabilitar
+ Action keyword Setting
+ Palavras-chave de ação
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Prioridade atual
+ Nova Prioridade
+ Prioridade
+ Change Plugin Results Priority
+ Diretório de Plugins
+ por
+ Tempo de inicialização:
+ Tempo de consulta:
+ Versão
+ Site
+ Desinstalar
+
+
+
+ Loja de Plugins
+ Nova Versão
+ Recently Updated
+ Plugins
+ Installed
+ Atualizar
+ Instalar
+ Desinstalar
+ Atualizar
+ Plugin already installed
+ Nova Versão
+ Este plugin foi atualizado nos últimos 7 dias
+ Nova Atualização Disponível
+
+
+
+
+ Tema
+ Appearance
+ Ver mais temas
+ Como criar um tema
+ Olá
+ Explorador
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Fonte da caixa de Consulta
+ Fonte do Resultado
+ Modo Janela
+ Opacidade
+ Tema {0} não existe, retorne para o tema padrão
+ Falha ao carregar tema {0}, retorne ao tema padrão
+ Pasta de Temas
+ Abrir Pasta de Temas
+ Paleta de Cores
+ Padrão do sistema
+ Claro
+ Escuro
+ Efeito Sonoro
+ Reproduzir um pequeno som ao abrir a janela de pesquisa
+ Animação
+ Utilizar Animação na Interface
+ Clock
+ Date
+
+
+ Atalho
+ Atalho
+ Atalho do Flow Launcher
+ Digite o atalho para exibir/ocultar o Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Modificadores de resultado aberto
+ Selecione uma tecla modificadora para abrir o resultar selecionado pelo teclado.
+ Mostrar tecla de atalho
+ Exibir atalho de seleção de resultado com resultados.
+ Atalho de Consulta Personalizada
+ Custom Query Shortcut
+ Built-in Shortcut
+ Consulta
+ Atalho
+ Expansion
+ Descrição
+ Apagar
+ Editar
+ Adicionar
+ Por favor selecione um item
+ Tem cereza de que deseja deletar o atalho {0} do plugin?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Efeito de sombra da janela de consulta
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Largura da janela
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Usar Segoe Fluent Icons
+ Usar Segoe Fluent Icons para resultados da consulta quando suportado
+ Press Key
+
+
+ Proxy HTTP
+ Habilitar Proxy HTTP
+ Servidor HTTP
+ Porta
+ Usuário
+ Senha
+ Testar Proxy
+ Salvar
+ O campo de servidor não pode ser vazio
+ O campo de porta não pode ser vazio
+ Formato de porta inválido
+ Configuração de proxy salva com sucesso
+ Proxy configurado corretamente
+ Conexão por proxy falhou
+
+
+ Sobre
+ Site
+ GitHub
+ Documentação
+ Versão
+ Ícones
+ Você ativou o Flow Launcher {0} vezes
+ Procurar atualizações
+ Become A Sponsor
+ A nova versão {0} está disponível, por favor reinicie o Flow Launcher.
+ Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.
+
+ Falha ao baixar atualizações, confira sua conexão e configuração de proxy para github-cloud.s3.amazonaws.com,
+ ou acesse https://github.com/Flow-Launcher/Flow.Launcher/releases para baixar manualmente.
+
+ Notas de Versão:
+ Dicas de Uso
+ Ferramentas de Desenvolvedor
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Assistente
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ Gerenciador de Arquivos
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Navegador da Web Padrão
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Navegador
+ Nome do Navegador
+ Browser Path
+ Nova Janela
+ Nova Aba
+ Private Mode
+
+
+ Alterar Prioridade
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Antiga palavra-chave da ação
+ Nova palavra-chave da ação
+ Cancelar
+ Finalizado
+ Não foi possível encontrar o plugin especificado
+ A nova palavra-chave da ação não pode ser vazia
+ A nova palavra-chave da ação já foi atribuída a outro plugin, por favor tente outra
+ Sucesso
+ Concluído com sucesso
+ Use * se não quiser especificar uma palavra-chave de ação
+
+
+ Atalho de Consulta Personalizada
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Prévia
+ Atalho indisponível, escolha outro
+ Atalho de plugin inválido
+ Atualizar
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Atalho indisponível
+
+
+ Versão
+ Horário
+ Por favor, conte como a aplicação parou de funcionar para que possamos consertar
+ Enviar Relatório
+ Cancelar
+ Geral
+ Exceções
+ Tipo de Exceção
+ Fonte
+ Rastreamento de pilha
+ Enviando
+ Relatório enviado com sucesso
+ Falha ao enviar relatório
+ Flow Launcher apresentou um erro
+
+
+ Por favor, aguarde...
+
+
+ Verificando por novas atualizações
+ Você já possui a versão mais recente do Flow Launcher
+ Atualização encontrada
+ Atualizando...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ A nova versão {0} do Flow Launcher agora está disponível
+ Ocorreu um erro ao tentar instalar atualizações do progama
+ Atualizar
+ Cancelar
+ Falha ao Atualizar
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Essa atualização reiniciará o Flow Launcher
+ Os seguintes arquivos serão atualizados
+ Atualizar arquivos
+ Atualizar descrição
+
+
+ Pular
+ Bem-vindo ao Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Teclas de Atalho
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finalizado. Aproveite o Flow Launcher. Não esqueça o atalho para iniciar :)
+
+
+
+ Voltar / Menu de Contexto
+ Item de Navegação
+ Abrir Menu de Contexto
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Histórico de Pesquisas
+ Back to Result in Context Menu
+ Autocompletar
+ Abrir / Executar Item Selecionado
+ Abrir Janela de Configurações
+ Recarregar Dados de Plugin
+
+ Clima
+ Clima no Resultado do Google
+ > ping 8.8.8.8
+ Comando de Console
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Notas Autoadesivas
+
+
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index 764ba542b..3e5bf26a4 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -1,8 +1,5 @@
-
-
+
+
Falha ao registar tecla de atalho: {0}
Não foi possível iniciar {0}
@@ -19,18 +16,37 @@
Copiar
Cortar
Colar
+ Desfazer
+ Selecionar tudo
+ Ficheiro
+ Pasta
+ Texto
Modo de jogo
- Suspender utilização de teclas de atalho
+ Suspender utilização das teclas de atalho
+ Repor posição
+ Repor posição da janela de pesquisa
- Definições Flow Launcher
+ Definições
Geral
Modo portátil
Guardar todas as definições e dados do utilizador numa pasta (indicado se utilizar discos amovíveis ou serviços cloud)
Iniciar Flow Launcher ao arrancar o sistema
+ Erro ao definir para iniciar ao arrancar
Ocultar Flow Launcher ao perder o foco
Não notificar acerca de novas versões
- Memorizar localização anterior
+ Posição da janela de pesquisa
+ Memorizar última posição
+ Monitor com o cursor do rato
+ Monitor com a janela focada
+ Monitor principal
+ Monitor personalizado
+ Posição da janela de pesquisa no monitor
+ Centro
+ Centro, cima
+ Esquerda, cima
+ Direita, cima
+ Posição personalizada
Idioma
Estilo da última consulta
Mostrar/ocultar resultados anteriores ao reiniciar Flow Launcher
@@ -38,28 +54,42 @@
Selecionar última consulta
Limpar última consulta
Número máximo de resultados
+ Também pode ajustar rapidamente através do atalho Ctrl+ e Ctrl-.
Ignorar teclas de atalho se em ecrã completo
Desativar ativação do Flow Launcher se alguma aplicação estiver em ecrã completo (recomendado para jogos)
Gestor de ficheiros padrão
Selecione o gestor de ficheiros utilizado para abrir a página
Navegador web padrão
Definições para Novo separador, Nova Janela e Modo privado
- Diretório Python
+ Caminho Python
+ Caminho Node.js
+ Selecione o executável Node.js
+ Selecione o executável pythonw.exe
+ Escrever sempre em inglês
+ Alterar, temporariamente, o método de introdução para inglês ao iniciar Flow launcher.
Atualização automática
- Selecionar
+ Selecionar
Ocultar Flow Launcher ao arrancar
Ocultar ícone na bandeja
- Precisão da pesquisa
+ Se o ícone da bandeja estiver oculto, pode abrir as Definições com um clique com o botão direito do rato na caixa de pesquisa.
+ Precisão da consulta
Altera a precisão mínima necessário para obter resultados
- Utilizar Pinyin
- Permitir Pinyin para a pesquisa. Pinyin é o sistema padrão da ortografia romanizada para tradução de mandarim
+ Pesquisar com Pinyin
+ Permite a utilização de Pinyin para pesquisar. Pinyin é um sistema normalizado de ortografia romanizada para tradução de mandarim.
+ Pré-visualizar sempre
+ Abrir painel de pré-visualização ao ativar Flow Launcher. Prima {0} para comutar a pré-visualização.
O efeito sombra não é permitido com este tema porque o efeito desfocar está ativo
- Plugins
+ Pesquisar plugins
+ Ctrl+F para pesquisar plugins
+ Não existem resultados
+ Experimente outro termo de pesquisa.
+ Plugin
+ Plugins
Mais plugins
- Ativar
- Desativar
+ Ativo
+ Inativo
Definição de palavra-chave
Palavra-chave da ação
Palavra-chave atual
@@ -68,25 +98,48 @@
Prioridade atual
Nova prioridade
Prioridade
- Diretório de plugins
+ Alterar prioridade dos resultados do plugin
+ Pasta de plugins
de
Tempo de arranque:
Tempo de consulta:
- | Versão
+ Versão
Site
+ Desinstalar
Loja de plugins
+ Novo lançamento
+ Atualizado recentemente
+ Plugins
+ Instalado
Recarregar
- Instalar
+ Instalar
+ Desinstalar
+ Atualizar
+ Plugin já instalado
+ Nova versão
+ Este plugin foi atualizado nos últimos 7 dias
+ Atualização disponível
+
+
Tema
+ Aparência
Galeria de temas
Como criar um tema
Olá
- Tipo de letra da caixa de pesquisa
+ Explorador
+ Pesquisar por ficheiros, pastas e conteúdo dos ficheiros
+ Pesquisa Web
+ Pesquisa na web com suporte a diversos motores de pesquisa
+ Programas
+ Iniciar programas como administrador ou utilizador
+ Terminador de processos
+ Terminar processos indesejados
+ Tipo de letra da consulta
Tipo de letra dos resultados
Modo da janela
Opacidade
@@ -102,27 +155,42 @@
Reproduzir um som ao abrir a janela de pesquisa
Animação
Utilizar animações na aplicação
+ Relógio
+ Data
Tecla de atalho
+ Teclas de atalho
Tecla de atalho Flow Launcher
Introduza o atalho para mostrar/ocultar Flow Launcher
+ Preview Hotkey
+ Introduza o atalho para mostrar/ocultar a pré-visualização na janela de pesquisa.
Tecla modificadora para os resultados
- Selecione a tecla modificadora para abrir o resultado através do teclado
+ Selecione a tecla modificadora para abrir o resultado com o teclado
Mostrar tecla de atalho
- Mostrar tecla de atalho em conjunto com os resultados.
- Tecla de atalho personalizada
+ Mostrar tecla de atalho perto dos resultados
+ Teclas de atalho personalizadas
+ Atalhos de consultas personalizadas
+ Atalhos nativos
Consulta
+ Atalho
+ Expansão
+ Descrição
Eliminar
Editar
Adicionar
Selecione um item
Tem a certeza de que deseja remover a tecla de atalho do plugin {0}?
+ Tem a certeza de que deseja eliminar o atalho: {0} com expansão {1}?
+ Obter texto da área de transferência.
+ Obter caminho a partir do explorador ativo.
Efeito de sombra da janela
Este efeito intensifica a utilização da GPU. Não deve ativar esta opção se o desempenho do seu computador for fraco.
Largura da janela
+ Pode aumentar o tamanho da janela com o atalho Ctrl+[ e diminuir com o atalho Ctrl+].
Utilizar ícones Segoe Fluent
Se possível, utilizar ícones Segoe Fluent para os resultados
+ Prima a tecla
Proxy HTTP
@@ -144,10 +212,12 @@
Acerca
Site
GitHub
- Documentos
+ Documentação
Versão
+ Ícones
Ativou o Flow Launcher {0} vezes
Procurar atualizações
+ Tornar-se patrocinador
Está disponível a versão {0}. Gostaria de reiniciar Flow Launcher para atualizar a sua versão?
Erro ao procurar atualizações. Verifique a sua ligação e as definições do proxy estabelecidas para api.github.com
@@ -158,12 +228,14 @@
DevTools
Pasta de definições
Pasta de registos
+ Limpar registos
+ Tem a certeza de que deseja remover todos os registos?
Assistente
Selecione o gestor de ficheiros
Especifique a localização do executável do gestor de ficheiros e, eventualmente, alguns argumentos. Os argumentos padrão são "%d" e o caminho é introduzido nesse local. Por exemplo, se necessitar de um comando como "totalcmd.exe /A c:\windows", o argumento é /A "%d".
- "%f" é o argumento que representa o caminho do ficheiro. É utilizado para dar ênfase ao nome do ficheiro ou da pasta se utilizar um gestor de ficheiros não nativo. Este argumento apenas está disponível para o item "Arg para ficheiro". Se o seu gestor de ficheiros não possuir esta funcionalidade, pode utilizar "%d".
+ "%f" é o argumento que representa o caminho do ficheiro. É utilizado para dar ênfase ao nome do ficheiro ou da pasta se utilizar um gestor de ficheiros não nativo. Este argumento apenas está disponível para o item "Argumento para ficheiro". Se o seu gestor de ficheiros não possuir esta funcionalidade, pode utilizar "%d".
Gestor de ficheiros
Nome do perfil
Caminho do gestor de ficheiros
@@ -199,19 +271,25 @@
Tecla de atalho personalizada
- Prima a tecla de atalho personalizada para introduzir automaticamente a consulta especificada
+ Prima uma tecla de atalho personalizada para abrir Flow Launcher e escrever automaticamente a pesquisa.
Antevisão
Tecla de atalho indisponível, por favor escolha outra
Tecla de atalho inválida
Atualizar
+
+ Atalho de consulta personalizada
+ Introduza o atalho que se expande automaticamente para a consulta especificada.
+ Este atallho já existe. Por favor escolha outro ou edite o existente.
+ O atalho e/ou a expansão não estão preenchidos.
+
Tecla de atalho indisponível
Versão
Hora
- Indique-nos, por favor, como é que o erro ocorreu para que o possamos corrigir
+ Indique-nos como é que o erro ocorreu para que o possamos corrigir
Enviar relatório
Cancelar
Geral
@@ -227,14 +305,14 @@
Por favor aguarde...
-
+
A procurar atualizações...
A sua versão de Flow Launcher é a mais recente
Atualização encontrada
A atualizar...
Flow Launcher não conseguiu mover o seu perfil de dados para a nova versão.
- Queira por favor mover a pasta do seu perfil de {0} para {1}
+Queira por favor mover a pasta do seu perfil de {0} para {1}
Nova atualização
Está disponível a versão {0} do Flow Launcher
@@ -253,14 +331,12 @@
Obrigado por utilizar Flow Launcher
Esta é a primeira vez que está a utilizar Flow Launcher!
Antes de utilizar a aplicação, este assistente ajuda a configurar Flow Launcher. Caso pretenda, pode ignorar este passo. Por favor escolha um idioma.
- Pesquise ficheiros/pastas e execute aplicações no seu computador
-
- Pode pesquisar aplicações, ficheiros, marcadores, YouTube, Twitter e muito mais. Tudo isto é efetuado através do teclado, dispensando a utilização do rato
-
- Flow Launcher é iniciado com a tecla de atalho abaixo. Experimente. Para alterar esta tecla de atalho, clique no valor e escolha a combinação de teclas a utilizar.
+ Pesquise ficheiros/pastas e execute aplicações no seu computador
+ Pode pesquisar aplicações, ficheiros, marcadores, YouTube, Twitter e muito mais. Tudo isto é efetuado através do teclado, dispensando a utilização do rato
+ Flow Launcher é iniciado com a tecla de atalho abaixo. Experimente. Para alterar esta tecla de atalho, clique no valor e escolha a combinação de teclas a utilizar
Teclas de atalho
Palavras-chave e comandos
- Pesquise na Web, inicie aplicações e execute funções através dos nossos plugins. Algumas ações são invocadas com palavras-chave mas, se quiser, podem ser invocadas sem essas palavras-chave. Teste as consultas abaixo para experimentar.
+ Pesquise na Web, inicie aplicações e execute funções com os nossos plugins. Algumas ações são invocadas com palavras-chave mas, se quiser, podem ser invocadas sem essas palavras-chave. Teste as consultas abaixo para experimentar.
Vamos iniciar Flow Launcher
Terminado. Desfrute de Flow Launcher. Não se esqueça da tecla de atalho :-)
@@ -269,8 +345,8 @@
Recuar/Menu de contexto
Navegação nos itens
Abrir menu de contexto
- Abrir pasta
- Executar como administrador
+ Abrir um ficheiro/Abrir a pasta respetiva
+ Executar como administrador/Abrir pasta no gestor de ficheiros
Histórico de consultas
Voltar aos resultados no menu de contexto
Conclusão automática
@@ -282,7 +358,7 @@
Meteorologia no Google
> ping 8.8.8.8
Comando de consola
- Bluetooth
+ s Bluetooth
Bluetooth nas definições do Windows
sn
Sticky Notes
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index 63c8d46ee..0ebadb8aa 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -1,133 +1,367 @@
-
-
- Регистрация хоткея {0} не удалась
- Не удалось запустить {0}
- Неверный формат файла flowlauncher плагина
- Отображать это окно выше всех при этом запросе
- Не отображать это окно выше всех при этом запросе
- Выполнить запрос:{0}
- Последний раз выполнен в:{0}
- Открыть
- Настройки
- О Flow Launcher
- Закрыть
-
-
- Настройки Flow Launcher
- Общие
- Запускать Flow Launcher при запуске системы
- Скрывать Flow Launcher если потерян фокус
- Не отображать сообщение об обновлении когда доступна новая версия
- Запомнить последнее место запуска
- Язык
- Максимальное количество результатов
- Игнорировать горячие клавиши, если окно в полноэкранном режиме
- Python Directory
- Auto Update
- Select
- Hide Flow Launcher on startup
-
-
- Плагины
- Найти больше плагинов
- Отключить
- Ключевое слово
- Папка
- Автор
- Инициализация:
- Запрос:
-
-
- Темы
- Найти больше тем
- Шрифт запросов
- Шрифт результатов
- Оконный режим
- Прозрачность
-
-
- Горячие клавиши
- Горячая клавиша Flow Launcher
- Модификаторы открытого результата
- Задаваемые горячие клавиши для запросов
- Показать Hotkey
- Удалить
- Изменить
- Добавить
- Сначала выберите элемент
- Вы уверены что хотите удалить горячую клавишу для плагина {0}?
-
-
- HTTP Прокси
- Включить HTTP прокси
- HTTP Сервер
- Порт
- Логин
- Пароль
- Проверить
- Сохранить
- Необходимо задать сервер
- Необходимо задать порт
- Неверный формат порта
- Прокси успешно сохранён
- Прокси сервер задан правильно
- Подключение к прокси серверу не удалось
-
-
- О Flow Launcher
- Сайт
- Версия
- Вы воспользовались Flow Launcher уже {0} раз
- Check for Updates
- New version {0} avaiable, please restart flowlauncher
- Release Notes:
-
-
- Текущая горячая клавиша
- Новая горячая клавиша
- Отменить
- Подтвердить
- Не удалось найти заданный плагин
- Новая горячая клавиша не может быть пустой
- Новая горячая клавиша уже используется другим плагином. Пожалуйста, задайте новую
- Сохранено
- Используйте * в случае, если вы не хотите задавать конкретную горячую клавишу
-
-
- Проверить
- Горячая клавиша недоступна. Пожалуйста, задайте новую
- Недействительная горячая клавиша плагина
- Изменить
-
-
- Горячая клавиша недоступна
-
-
- Версия
- Время
- Пожалуйста, сообщите что произошло когда произошёл сбой в приложении, чтобы мы могли его исправить
- Отправить отчёт
- Отмена
- Общие
- Исключения
- Тип исключения
- Источник
- Трессировка стека
- Отправляем
- Отчёт успешно отправлен
- Не удалось отправить отчёт
- Произошёл сбой в Flow Launcher
-
-
- Доступна новая версия Flow Launcher V{0}
- Произошла ошибка при попытке установить обновление
- Обновить
- Отмена
- Это обновление перезапустит Flow Launcher
- Следующие файлы будут обновлены
- Обновить файлы
- Описание обновления
-
-
\ No newline at end of file
+
+
+
+ Регистрация хоткея {0} не удалась
+ Не удалось запустить {0}
+ Недопустимый формат файла плагина Flow Launcher
+ Отображать это окно выше всех при этом запросе
+ Не отображать это окно выше всех при этом запросе
+ Выполнить запрос: {0}
+ Последний раз выполнен: {0}
+ Открыть
+ Настройки
+ О Flow Launcher
+ Выйти
+ Закрыть
+ Копировать
+ Вырезать
+ Вставить
+ Отмена
+ Выбрать все
+ Файл
+ Папка
+ Текст
+ Игровой режим
+ Приостановить использование горячих клавиш.
+ Сброс положения
+ Сброс положения окна поиска
+
+
+ Настройки
+ Общие
+ Портативный режим
+ Храните все настройки и данные пользователя в одной папке (полезно при использовании со съёмными дисками или облачными сервисами).
+ Запускать Flow Launcher при запуске системы
+ Ошибка настройки запуска при запуске
+ Скрывать Flow Launcher, если потерян фокуc
+ Не отображать сообщение об обновлении, когда доступна новая версия
+ Положение окна поиска
+ Запомнить последнее положение
+ Монитор с курсором мыши
+ Монитор с фокусированным окном
+ Основной монитор
+ Свой монитор
+ Положение окна поиска на мониторе
+ По центру
+ По центру сверху
+ Слева сверху
+ Справа сверху
+ Своё положение
+ Язык
+ Вид последнего запроса
+ Показать/скрыть предыдущие результаты при повторном запуске Flow Launcher.
+ Сохранение последнего запроса
+ Выбор последнего запроса
+ Очистить последний запрос
+ Максимальное количество результатов
+ Вы также можете быстро настроить это с помощью CTRL+плюс и CTRL+минус.
+ Игнорировать горячие клавиши в полноэкранном режиме
+ Отключить запуск Flow Launcher при запущенном полноэкранном приложении (рекомендуется для игр).
+ Файловый менеджер по умолчанию
+ Выберите файловый менеджер, который будет использоваться при открытии папки.
+ Браузер по умолчанию
+ Настройки для новой вкладки, нового окна, приватного режима.
+ Путь к Python
+ Путь к Node.js
+ Пожалуйста, выберите исполняемый файл Node.js
+ Пожалуйста, выберите pythonw.exe
+ Всегда начинать печатать в английском режиме
+ Временно изменить способ ввода на английский при запуске Flow.
+ Автообновление
+ Выбор
+ Скрыть Flow Launcher при запуске
+ Скрыть значок в трее
+ Когда значок скрыт в трее, меню настройки можно открыть, щёлкнув правой кнопкой мыши на окне поиска.
+ Точность поиска запросов
+ Изменение минимального количества совпадений при поиске, необходимого для получения результатов.
+ Поиск с использованием пиньинь
+ Позволяет использовать пиньинь для поиска. Пиньинь - это стандартная система латинизированной орфографии для перевода китайского языка.
+ Всегда предпросмотр
+ Всегда открывать панель предварительного просмотра при запуске Flow. Нажмите {0}, чтобы переключить предварительный просмотр.
+ Эффект тени не допускается, если в текущей теме включён эффект размытия
+
+
+ Поиск плагина
+ Ctrl+F для поиска плагинов
+ Результаты не найдены
+ Пожалуйста, попробуйте другой запрос.
+ Плагины
+ Плагины
+ Найти больше плагинов
+ Вкл.
+ Отключить
+ Настройка ключевого слова действия
+ Горячая клавиша
+ Ключевое слово текущего действия
+ Ключевое слово нового действия
+ Изменить ключевое слово действия
+ Текущий приоритет
+ Новый приоритет
+ Приоритет
+ Изменение приоритета результатов плагина
+ Директория плагинов
+ автор
+ Инициализация:
+ Запрос:
+ Версия
+ Веб-сайт
+ Удалить
+
+
+
+ Магазин плагинов
+ Новый выпуск
+ Недавно обновлено
+ Плагины
+ Установлено
+ Обновить
+ Установить
+ Удалить
+ Обновить
+ Плагин уже установлен
+ Новая версия
+ Этот плагин был обновлён за последние 7 дней
+ Доступно новое обновление
+
+
+
+
+ Тема
+ Внешний вид
+ Найти больше тем
+ Как создать тему
+ Привет
+ Проводник
+ Поиск файлов, папок и содержимого файлов
+ Веб-поиск
+ Поиск в Интернете с помощью различных поисковых систем
+ Программа
+ Запуск программ от имени администратора или другого пользователя
+ Удалятор процессов
+ Завершение нежелательных процессов
+ Шрифт запросов
+ Шрифт результатов
+ Оконный режим
+ Прозрачность
+ Тема {0} не существует, откат к теме по умолчанию
+ Не удалось загрузить тему {0}, откат к теме по умолчанию
+ Папка тем
+ Открыть папку с темами
+ Цветовая схема
+ Системное по умолчанию
+ Светлая
+ Тёмная
+ Звуковой эффект
+ Воспроизведение небольшого звука при открытии окна поиска
+ Анимация
+ Использование анимации в меню
+ Часы
+ Дата
+
+
+ Горячая клавиша
+ Горячая клавиша
+ Горячая клавиша Flow Launcher
+ Введите ярлык, чтобы показать/скрыть Flow Launcher.
+ Просмотр горячей клавиши
+ Введите ярлык для показа/скрытия предварительного просмотра в окне поиска.
+ Открыть ключ модификации результата
+ Выберите клавишу-модификатор, чтобы открыть выбранный результат с помощью клавиатуры.
+ Показать горячую клавишу
+ Показать горячую клавишу выбора результата с результатами.
+ Задаваемые горячие клавиши для запросов
+ Custom Query Shortcut
+ Built-in Shortcut
+ Запрос
+ Ярлык
+ Расширение
+ Описание
+ Удалить
+ Редактировать
+ Добавить
+ Сначала выберите элемент
+ Вы уверены что хотите удалить горячую клавишу для плагина {0}?
+ Вы уверены, что хотите удалить ярлык: {0} с расширением {1}?
+ Получение текста из буфера обмена.
+ Получение пути из активного проводника.
+ Эффект тени в окне запроса
+ Эффект тени существенно задействует ресурсы видеокарты. Не рекомендуется, если производительность вашего компьютера ограничена.
+ Размер ширины окна
+ Вы также можете быстро настроить это с помощью Ctrl+[ и Ctrl+].
+ Использование значков Segoe Fluent
+ Использовать значки Segoe Fluent для результатов запросов, где они поддерживаются
+ Нажмите клавишу
+
+
+ HTTP Прокси
+ Включить HTTP прокси
+ HTTP-сервер
+ Порт
+ Имя пользователя
+ Пароль
+ Тест прокси
+ Сохранить
+ Поле сервера не может быть пустым
+ Поле порта должно быть заполнено
+ Неверный формат порта
+ Прокси успешно сохранён
+ Прокси сервер задан правильно
+ Подключение к прокси серверу не удалось
+
+
+ О Flow Launcher
+ Веб-сайт
+ GitHub
+ Документация
+ Версия
+ Значки
+ Вы воспользовались Flow Launcher уже {0} раз
+ Проверить наличие обновлений
+ Стать спонсором
+ Доступна новая версия {0}. Вы хотите перезапустить Flow Launcher, чтобы использовать обновление?
+ Проверка обновлений не удалась, пожалуйста, проверьте настройки подключения и прокси-сервера к api.github.com.
+
+ Загрузка обновлений не удалась, пожалуйста, проверьте настройки соединения и прокси на github-cloud.s3.amazonaws.com,
+ или перейдите по адресу https://github.com/Flow-Launcher/Flow.Launcher/releases, чтобы загрузить обновления вручную.
+
+ Список изменений
+ Советы по применению
+ Инструменты разработчика
+ Папка настроек
+ Папка журнала
+ Очистить журнал
+ Вы уверены, что хотите удалить все журналы?
+ Мастер
+
+
+ Выбор менеджера файлов
+ Укажите расположение файла в файловом менеджере, который вы используете, и добавьте аргументы, если необходимо. По умолчанию аргументами являются «%d», и путь вводится в этом месте. Например, если требуется команда, такая как «totalcmd.exe /A c:\windows», аргументом будет /A «%d».
+ «%f» - это аргумент, представляющий путь к файлу. Он используется для подчёркивания имени файла/папки при открытии определённого местоположения файла в стороннем файловом менеджере. Этот аргумент доступен только в пункте «Аргумент для файла». Если файловый менеджер не имеет такой функции, вы можете использовать «%d».
+ Файловый менеджер
+ Имя профиля
+ Путь к файловому менеджеру
+ Аргумент для папки
+ Аргумент для файла
+
+
+ Браузер по умолчанию
+ Настройка по умолчанию соответствует настройке браузера по умолчанию в ОС. Если указано отдельно, Flow использует этот браузер.
+ Браузер
+ Название браузера
+ Путь к браузеру
+ Новое окно
+ Новая вкладка
+ Приватный режим
+
+
+ Изменить приоритет
+ Чем больше число, тем выше будет оцениваться результат. Попробуйте установить значение 5. Если вы хотите, чтобы результаты были ниже, чем у любого другого плагина, укажите отрицательное число
+ Пожалуйста, укажите действительное целое число для приоритета!
+
+
+ Текущая горячая клавиша
+ Новая горячая клавиша
+ Отменить
+ Подтвердить
+ Не удалось найти заданный плагин
+ Новая горячая клавиша не может быть пустой
+ Новая горячая клавиша уже используется другим плагином. Пожалуйста, задайте новую
+ Успешно
+ Выполнено успешно
+ Введите горячую клавишу, которое вы хотите использовать для запуска плагина. Используйте *, если вы не хотите ничего указывать, и плагин будет запускаться без каких-либо горячих клавиш.
+
+
+ Задаваемые горячие клавиши для запросов
+ Нажмите свою горячую клавишу, чтобы открыть Flow Launcher и автоматически ввести заданный запрос.
+ Предпросмотр
+ Горячая клавиша недоступна. Пожалуйста, задайте новую
+ Недействительная горячая клавиша плагина
+ Обновить
+
+
+ Ярлык пользовательского запроса
+ Введите ярлык, который автоматически расширяется до указанного запроса.
+ Ярлык уже существует, пожалуйста, введите новый ярлык или измените существующий.
+ Ярлык и/или его расширение пусты.
+
+
+ Горячая клавиша недоступна
+
+
+ Версия
+ Время
+ Пожалуйста, сообщите, что произошло, чтобы мы могли это исправить
+ Отправить отчёт
+ Отменить
+ Общие
+ Исключения
+ Тип исключения
+ Источник
+ Трассировка стека
+ Отправляем
+ Отчёт успешно отправлен
+ Не удалось отправить отчёт
+ Произошёл сбой в Flow Launcher
+
+
+ Пожалуйста, подождите...
+
+
+ Проверка наличия нового обновления
+ У вас уже установлена последняя версия Flow Launcher
+ Найдено обновление
+ Обновление...
+
+ Flow Launcher не смог переместить данные профиля пользователя в новую версию обновления.
+ Пожалуйста, вручную переместите папку с данными профиля из {0} в {1}
+
+ Новое обновление
+ Доступна новая версия Flow Launcher {0}
+ Произошла ошибка при попытке установить обновление
+ Обновить
+ Отменить
+ Обновление не удалось
+ Проверьте соединение и попробуйте обновить настройки прокси на github-cloud.s3.amazonaws.com.
+ Это обновление перезапустит Flow Launcher
+ Следующие файлы будут обновлены
+ Обновить файлы
+ Обновить описание
+
+
+ Пропустить
+ Добро пожаловать в Flow Launcher
+ Здравствуйте, вы впервые запускаете Flow Launcher!
+ Перед началом, этот мастер поможет настроить Flow Launcher. При желании его можно пропустить. Пожалуйста, выберите язык
+ Поиск и запуск всех файлов и приложений на вашем ПК
+ Ищите всё: приложения, файлы, закладки, YouTube, Твиттер и многое другое. И всё это с удобной клавиатуры, не прикасаясь к мыши.
+ Flow Launcher запускается с приведённой ниже горячей клавишей, попробуйте использовать её прямо сейчас. Чтобы изменить её, щёлкните на вводе и нажмите нужную горячую клавишу на клавиатуре.
+ Горячие клавиши
+ Ключевое слово и команды
+ Поиск в Интернете, запуск приложений или выполнение различных функций с помощью плагинов Flow Launcher. Некоторые функции начинаются с ключевого слова действия, и при необходимости их можно использовать без ключевых слов действия. Попробуйте выполнить приведённые ниже запросы в Flow Launcher.
+ Давайте запустим Flow Launcher
+ Готово. Наслаждайтесь Flow Launcher. Не забудьте про горячую клавишу для запуска :)
+
+
+
+ Назад / контекстное меню
+ Навигация по элементам
+ Открыть контекстное меню
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ История запросов
+ Вернуться к результату в контекстном меню
+ Автозаполнение
+ Открыть / Выполнить выбранный элемент
+ Открыть окно настроек
+ Перезагрузить данные плагинов
+
+ Команда Weather
+ Погода в результатах Google
+ > ping 8.8.8.8
+ Команда Shell
+ Команда s - Bluetooth
+ Bluetooth в настройках Windows
+ Команда sn
+ Заметки
+
+
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index dac746d0f..ea89c68af 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -16,18 +16,37 @@
Kopírovať
Vystrihnúť
Prilepiť
+ Späť
+ Vybrať všetko
+ Súbor
+ Priečinok
+ Text
Herný režim
Pozastaviť používanie klávesových skratiek.
+ Resetovať pozíciu
+ Resetovať pozíciu vyhľadávacieho okna
- Nastavenia Flow Launchera
+ Nastavenia
Všeobecné
Prenosný režim
Uloží všetky nastavenia a používateľské údaje do jedného priečinka (Užitočné pri vymeniteľných diskoch a cloudových službách).
Spustiť Flow Launcher pri spustení systému
+ Chybné nastavenie spustenia pri spustení
Schovať Flow Launcher po strate fokusu
Nezobrazovať upozornenia na novú verziu
- Zapamätať si posledné umiestnenie
+ Pozícia vyhľadávacieho okna
+ Zapamätať si poslednú pozíciu
+ Monitor s kurzorom myši
+ Monitor s aktívnym oknom
+ Primárny monitor
+ Vlastný monitor
+ Poloha vyhľadávacieho okna na monitore
+ Stred
+ Hore v strede
+ Vľavo hore
+ Vpravo hore
+ Vlastná pozícia
Jazyk
Posledné vyhľadávanie
Zobrazí/skryje predchádzajúce výsledky pri opätovnej aktivácii Flow Launchera.
@@ -35,28 +54,42 @@
Označiť
Vymazať
Maximum výsledkov
+ Túto hodnotu môžete rýchlo upraviť aj pomocou klávesových skratiek CTRL + znamienko plus (+) a CTRL + znamienko mínus (-).
Ignorovať klávesové skratky v režime na celú obrazovku
Zakázať aktiváciu Flow Launchera, keď je aktívna aplikácia na celú obrazovku (odporúčané pre hry).
Predvolený správca súborov
Vyberte správcu súborov, ktorý sa má použiť pri otváraní priečinka.
Predvolený webový prehliadač
Nastavenie pre novú kartu, nové okno, privátny režim.
- Priečinok s Pythonom
+ Cesta k Pythonu
+ Cesta k Node.js
+ Vyberte spustiteľný súbor Node.js
+ Prosím, vyberte pythonw.exe
+ Vždy písať s anglickou klávesnicou
+ Pri aktivácii Flowu sa dočasne zmení klávesnica na anglickú.
Automatická aktualizácia
- Vybrať
+ Vybrať
Schovať Flow Launcher po spustení
Schovať ikonu z oblasti oznámení
+ Keď je ikona skrytá z oblasti oznámení, nastavenia možno otvoriť kliknutím pravým tlačidlom myši na okno vyhľadávania.
Presnosť vyhľadávania
Mení minimálne skóre zhody potrebné na zobrazenie výsledkov.
- Použiť Pinyin
- Umožňuje vyhľadávanie pomocou Pinyin. Pinyin je štandardný systém romanizovaného pravopisu pre transliteráciu čínštiny
+ Vyhľadávanie pomocou pchin-jin
+ Umožňuje vyhľadávanie pomocou pchin-jin. Pchin-jin je systém zápisu čínskeho jazyka pomocou písmen latinky.
+ Vždy zobraziť náhľad
+ Pri aktivácii Flowu vždy otvoriť panel s náhľadom. Stlačením klávesu {0} prepnete náhľad.
Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostrenia
+ Vyhľadať plugin
+ Vyhľadať plugin Ctrl+F
+ Nenašli sa žiadne výsledky
+ Skúste použiť iné vyhľadávanie.
Pluginy
+ Pluginy
Nájsť ďalšie pluginy
- Zap.
- Vyp.
+ Zapnuté
+ Vypnuté
Nastavenie akčného príkazu
Aktivačný príkaz
Aktuálny aktivačný príkaz
@@ -65,24 +98,47 @@
Aktuálna priorita
Nová priorita
Priorita
- Priečinok s pluginmi
+ Zmena priority výsledkov pluginu
+ Priečinok pluginu
od
Inicializácia:
Trvanie dopytu:
- | Verzia
+ Verzia
Webstránka
+ Odinštalovať
Repozitár pluginov
+ Nová verzia
+ Nedávno aktualizované
+ Pluginy
+ Nainštalované
Obnoviť
- Inštalovať
+ Inštalovať
+ Odinštalovať
+ Aktualizovať
+ Plugin je už nainštalovaný
+ Nová verzia
+ Tento plugin bol aktualizovaný za posledných 7 dní
+ K dispozícii je nová aktualizácia
+
+
Motív
+ Vzhľad
Galéria motívov
Ako vytvoriť motív
Ahojte
+ Prieskumník
+ Vyhľadávanie súborov, priečinkov a obsahu súborov
+ Webové vyhľadávanie
+ Vyhľadávanie na webe s podporou rôznych vyhľadávačov
+ Program
+ Spúšťanie programov ako správca alebo iný používateľ
+ ProcessKiller
+ Ukončenie nežiaducich procesov
Písmo vyhľadávacieho poľa
Písmo výsledkov
Režim okno
@@ -93,33 +149,48 @@
Otvoriť priečinok s motívmi
Farebná schéma
Predvolené systémom
- Svetlý
- Tmavý
+ Svetlá
+ Tmavá
Zvukový efekt
Po otvorení okna vyhľadávania prehrať krátky zvuk
Animácia
Animovať používateľské rozhranie
+ Hodiny
+ Dátum
Klávesové skratky
+ Klávesové skratky
Klávesová skratka pre Flow Launcher
Zadajte skratku na zobrazenie/skrytie Flow Launchera.
+ Klávesová skratka pre náhľad
+ Zadajte klávesovú skratku pre zobrazenie/skytie náhľadu vo vyhľadávacom okne.
Modifikačný kláves na otvorenie výsledkov
Vyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice.
Zobraziť klávesovú skratku
Zobrazí klávesovú skratku spolu s výsledkami.
- Klávesová skratka vlastného vyhľadávania
+ Klávesové skratky vlastného vyhľadávania
+ Klávesové skratky vlastného dopytu
+ Vstavané skratky
Dopyt
+ Skratka
+ Rozšírenie
+ Popis
Odstrániť
Upraviť
Pridať
Vyberte položku, prosím
Ste si istý, že chcete odstrániť klávesovú skratku {0} pre plugin?
+ Naozaj chcete odstrániť skratku: {0} pre dopyt {1}?
+ Kopírovať text do schránky.
+ Získať cestu z aktívneho Prieskumníka.
Tieňový efekt v poli vyhľadávania
Tieňový efekt významne využíva GPU. Neodporúča sa, ak je výkon počítača obmedzený.
Šírka okna
+ Túto hodnotu môžete rýchlo upraviť aj pomocou klávesov Ctrl + [ a Ctrl + ].
Použiť ikony Segoe Fluent
Použiť ikony Segoe Fluent, ak sú podporované
+ Stlačte kláves
HTTP proxy
@@ -140,11 +211,13 @@
O aplikácii
Webstránka
- Github
+ GitHub
Dokumentácia
Verzia
+ Ikony
Flow Launcher bol aktivovaný {0}-krát
Vyhľadať aktualizácie
+ Stať sa sponzorom
Je dostupná nová verzia {0}, chcete reštartovať Flow Launcher, aby sa mohol aktualizovať?
Vyhľadávanie aktualizácií zlyhalo, prosím, skontrolujte pripojenie na internet a nastavenie proxy server k api.github.com.
@@ -156,6 +229,8 @@
Nástroje pre vývojárov
Priečinok s nastaveniami
Priečinok s logmi
+ Vymazať logy
+ Naozaj chcete odstrániť všetky logy?
Sprievodca
@@ -197,12 +272,18 @@
Klávesová skratka vlastného vyhľadávania
- Stlačením klávesovej skratky sa automaticky vloží zadaný výraz.
+ Stlačením vlastnej klávesovej skratky otvoríte Flow Launcher a automaticky vložíte zadaný dotaz.
Náhľad
Klávesová skratka je nedostupná, prosím, zadajte novú skratku
Neplatná klávesová skratka pluginu
Aktualizovať
+
+ Klávesová skratka vlastného dopytu
+ Zadajte skratku, ktorá automaticky vloží konkrétny dopyt.
+ Skratka už existuje, zadajte novú skratku alebo upravte existujúcu.
+ Skratka a/alebo jej celé znenie je prázdne.
+
Klávesová skratka je nedostupná
@@ -225,7 +306,7 @@
Čakajte, prosím...
-
+
Vyhľadávajú sa aktualizácie
Už máte najnovšiu verziu Flow Launchera
Bola nájdená aktualizácia
@@ -265,8 +346,8 @@
Späť/kontextová ponuka
Navigácia medzi položkami
Otvoriť kontextovú ponuku
- Otvoriť umiestnenie priečinka
- Spustiť ako správca
+ Otvoriť súbor/Priečinok súboru
+ Spustiť ako správca/Otvoriť priečinok v predvolenom správcovi súborov
História dopytov
Návrat na výsledky z kontextovej ponuky
Automatické dokončovanie
@@ -278,7 +359,7 @@
Počasie na Googli
> ping 8.8.8.8
Príkazový riadok
- Bluetooth
+ s Bluetooth
Bluetooth v nastaveniach Windowsu
sn
Sticky Notes
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 3efe27a47..bc05022f9 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -1,142 +1,367 @@
-
-
- Neuspešno registrovana prečica: {0}
- Neuspešno pokretanje {0}
- Nepravilni Flow Launcher plugin format datoteke
- Postavi kao najviši u ovom upitu
- Poništi najviši u ovom upitu
- Izvrši upit: {0}
- Vreme poslednjeg izvršenja: {0}
- Otvori
- Podešavanja
- O Flow Launcher-u
- Izlaz
-
-
- Flow Launcher Podešavanja
- Opšte
- Pokreni Flow Launcher pri podizanju sistema
- Sakri Flow Launcher kada se izgubi fokus
- Ne prikazuj obaveštenje o novoj verziji
- Zapamti lokaciju poslednjeg pokretanja
- Jezik
- Stil Poslednjeg upita
- Sačuvaj poslednji Upit
- Selektuj poslednji Upit
- Isprazni poslednji Upit
- Maksimum prikazanih rezultata
- Ignoriši prečice u fullscreen režimu
- Python direktorijum
- Auto ažuriranje
- Izaberi
- Sakrij Flow Launcher pri podizanju sistema
-
-
- Plugin
- Nađi još plugin-a
- Onemogući
- Ključne reči
- Plugin direktorijum
- Autor
- Vreme inicijalizacije:
- Vreme upita:
-
-
- Tema
- Pretražite još tema
- Font upita
- Font rezultata
- Režim prozora
- Neprozirnost
-
-
- Prečica
- Flow Launcher prečica
- Отворите модификаторе резултата
- покажи хоткеи
- prečica za ručno dodat upit
- Obriši
- Izmeni
- Dodaj
- Molim Vas izaberite stavku
- Da li ste sigurni da želite da obrišete prečicu za {0} plugin?
-
-
- HTTP proksi
- Uključi HTTP proksi
- HTTP Server
- Port
- Korisničko ime
- Šifra
- Test proksi
- Sačuvaj
- Polje za server ne može da bude prazno
- Polje za port ne može da bude prazno
- Nepravilan format porta
- Podešavanja proksija uspešno sačuvana
- Proksi uspešno podešen
- Veza sa proksijem neuspešna
-
-
- O Flow Launcher-u
- Veb sajt
- Verzija
- Aktivirali ste Flow Launcher {0} puta
- Proveri ažuriranja
- Nove verzija {0} je dostupna, molim Vas ponovo pokrenite Flow Launcher.
- Neuspešna provera ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema api.github.com.
-
- Neuspešno preuzimanje ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema github-cloud.s3.amazonaws.com,
- ili posetite https://github.com/Flow-Launcher/Flow.Launcher/releases da preuzmete ažuriranja ručno.
-
- U novoj verziji:
-
-
- Prečica za staru radnju
- Prečica za novu radnju
- Otkaži
- Gotovo
- Navedeni plugin nije moguće pronaći
- Prečica za novu radnju ne može da bude prazna
- Prečica za novu radnju je dodeljena drugom plugin-u, molim Vas dodelite drugu prečicu
- Uspešno
- Koristite * ako ne želite da navedete prečicu za radnju
-
-
- Pregled
- Prečica je nedustupna, molim Vas izaberite drugu prečicu
- Nepravlna prečica za plugin
- Ažuriraj
-
-
- Prečica nedostupna
-
-
- Verzija
- Vreme
- Molimo Vas recite nam kako je aplikacija prestala sa radom, da bi smo je ispravili
- Pošalji izveštaj
- Otkaži
- Opšte
- Izuzetak
- Tipovi Izuzetaka
- Izvor
- Stack Trace
- Slanje
- Izveštaj uspešno poslat
- Izveštaj neuspešno poslat
- Flow Launcher je dobio grešku
-
-
- Nova verzija Flow Launcher-a {0} je dostupna
- Došlo je do greške prilokom instalacije ažuriranja
- Ažuriraj
- Otkaži
- Ova nadogradnja će ponovo pokrenuti Flow Launcher
- Sledeće datoteke će biti ažurirane
- Ažuriraj datoteke
- Opis ažuriranja
-
-
\ No newline at end of file
+
+
+
+ Neuspešno registrovana prečica: {0}
+ Neuspešno pokretanje {0}
+ Nepravilni Flow Launcher plugin format datoteke
+ Postavi kao najviši u ovom upitu
+ Poništi najviši u ovom upitu
+ Izvrši upit: {0}
+ Vreme poslednjeg izvršenja: {0}
+ Otvori
+ Podešavanja
+ O Flow Launcher-u
+ Izlaz
+ Close
+ Copy
+ Cut
+ Paste
+ Undo
+ Select All
+ File
+ Folder
+ Text
+ Game Mode
+ Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
+
+
+ Podešavanja
+ Opšte
+ Portable Mode
+ Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Pokreni Flow Launcher pri podizanju sistema
+ Error setting launch on startup
+ Sakri Flow Launcher kada se izgubi fokus
+ Ne prikazuj obaveštenje o novoj verziji
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Jezik
+ Stil Poslednjeg upita
+ Show/Hide previous results when Flow Launcher is reactivated.
+ Sačuvaj poslednji Upit
+ Selektuj poslednji Upit
+ Isprazni poslednji Upit
+ Maksimum prikazanih rezultata
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignoriši prečice u fullscreen režimu
+ Disable Flow Launcher activation when a full screen application is active (Recommended for games).
+ Default File Manager
+ Select the file manager to use when opening the folder.
+ Default Web Browser
+ Setting for New Tab, New Window, Private Mode.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Auto ažuriranje
+ Izaberi
+ Sakrij Flow Launcher pri podizanju sistema
+ Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ Search with Pinyin
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Nađi još plugin-a
+ On
+ Onemogući
+ Action keyword Setting
+ Ključne reči
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Current Priority
+ New Priority
+ Priority
+ Change Plugin Results Priority
+ Plugin direktorijum
+ by
+ Vreme inicijalizacije:
+ Vreme upita:
+ Verzija
+ Website
+ Uninstall
+
+
+
+ Plugin Store
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Refresh
+ Install
+ Uninstall
+ Ažuriraj
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Tema
+ Appearance
+ Pretražite još tema
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Font upita
+ Font rezultata
+ Režim prozora
+ Neprozirnost
+ Theme {0} not exists, fallback to default theme
+ Fail to load theme {0}, fallback to default theme
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Animation
+ Use Animation in UI
+ Clock
+ Date
+
+
+ Prečica
+ Prečica
+ Flow Launcher prečica
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Отворите модификаторе резултата
+ Select a modifier key to open selected result via keyboard.
+ покажи хоткеи
+ Show result selection hotkey with results.
+ prečica za ručno dodat upit
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Obriši
+ Izmeni
+ Dodaj
+ Molim Vas izaberite stavku
+ Da li ste sigurni da želite da obrišete prečicu za {0} plugin?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP proksi
+ Uključi HTTP proksi
+ HTTP Server
+ Port
+ Korisničko ime
+ Šifra
+ Test proksi
+ Sačuvaj
+ Polje za server ne može da bude prazno
+ Polje za port ne može da bude prazno
+ Nepravilan format porta
+ Podešavanja proksija uspešno sačuvana
+ Proksi uspešno podešen
+ Veza sa proksijem neuspešna
+
+
+ O Flow Launcher-u
+ Website
+ GitHub
+ Docs
+ Verzija
+ Icons
+ Aktivirali ste Flow Launcher {0} puta
+ Proveri ažuriranja
+ Become A Sponsor
+ Nove verzija {0} je dostupna, molim Vas ponovo pokrenite Flow Launcher.
+ Neuspešna provera ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema api.github.com.
+
+ Neuspešno preuzimanje ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema github-cloud.s3.amazonaws.com,
+ ili posetite https://github.com/Flow-Launcher/Flow.Launcher/releases da preuzmete ažuriranja ručno.
+
+ U novoj verziji
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Prečica za staru radnju
+ Prečica za novu radnju
+ Otkaži
+ Gotovo
+ Navedeni plugin nije moguće pronaći
+ Prečica za novu radnju ne može da bude prazna
+ Prečica za novu radnju je dodeljena drugom plugin-u, molim Vas dodelite drugu prečicu
+ Uspešno
+ Completed successfully
+ Koristite * ako ne želite da navedete prečicu za radnju
+
+
+ prečica za ručno dodat upit
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Pregled
+ Prečica je nedustupna, molim Vas izaberite drugu prečicu
+ Nepravlna prečica za plugin
+ Ažuriraj
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Prečica nedostupna
+
+
+ Verzija
+ Vreme
+ Molimo Vas recite nam kako je aplikacija prestala sa radom, da bi smo je ispravili
+ Pošalji izveštaj
+ Otkaži
+ Opšte
+ Izuzetak
+ Tipovi Izuzetaka
+ Izvor
+ Stack Trace
+ Slanje
+ Izveštaj uspešno poslat
+ Izveštaj neuspešno poslat
+ Flow Launcher je dobio grešku
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Nova verzija Flow Launcher-a {0} je dostupna
+ Došlo je do greške prilokom instalacije ažuriranja
+ Ažuriraj
+ Otkaži
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Ova nadogradnja će ponovo pokrenuti Flow Launcher
+ Sledeće datoteke će biti ažurirane
+ Ažuriraj datoteke
+ Opis ažuriranja
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index a39b55b23..923d0be49 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -1,146 +1,367 @@
-
-
- Kısayol tuşu ataması başarısız oldu: {0}
- {0} başlatılamıyor
- Geçersiz Flow Launcher eklenti dosyası formatı
- Bu sorgu için başa sabitle
- Sabitlemeyi kaldır
- Sorguyu çalıştır: {0}
- Son çalıştırma zamanı: {0}
- Aç
- Ayarlar
- Hakkında
- Çıkış
-
-
- Flow Launcher Ayarları
- Genel
- Flow Launcher'u başlangıçta başlat
- Odak pencereden ayrıldığında Flow Launcher'u gizle
- Güncelleme bildirimlerini gösterme
- Pencere konumunu hatırla
- Dil
- Pencere açıldığında
- Son sorguyu sakla
- Son sorguyu sakla ve tümünü seç
- Sorgu kutusunu temizle
- Maksimum sonuç sayısı
- Tam ekran modunda kısayol tuşunu gözardı et
- Python Konumu
- Otomatik Güncelle
- Seç
- Başlangıçta Flow Launcher'u gizle
- Sistem çekmecesi simgesini gizle
- Sorgu Arama Hassasiyeti
-
-
- Eklentiler
- Daha fazla eklenti bul
- Devre Dışı
- Anahtar Kelimeler
- Eklenti Klasörü
- Yapımcı
- Açılış Süresi:
- Sorgu Süresi:
-
-
- Temalar
- Daha fazla tema bul
- Pencere Yazı Tipi
- Sonuç Yazı Tipi
- Pencere Modu
- Saydamlık
- {0} isimli tema bulunamadı, varsayılan temaya dönülüyor.
- {0} isimli tema yüklenirken hata oluştu, varsayılan temaya dönülüyor.
-
-
- Kısayol Tuşu
- Flow Launcher Kısayolu
- Açık Sonuç Değiştiricileri
- Özel Sorgu Kısayolları
- Kısayol Tuşunu Göster
- Sil
- Düzenle
- Ekle
- Lütfen bir öğe seçin
- {0} eklentisi için olan kısayolu silmek istediğinize emin misiniz?
-
-
- Vekil Sunucu
- HTTP vekil sunucuyu etkinleştir.
- Sunucu Adresi
- Port
- Kullanıcı Adı
- Parola
- Ayarları Sına
- Kaydet
- Sunucu adresi boş olamaz
- Port boş olamaz
- Port biçimi geçersiz
- Vekil sunucu ayarları başarıyla kaydedildi
- Vekil sunucu doğru olarak ayarlandı
- Vekil sunucuya bağlanılırken hata oluştu
-
-
- Hakkında
- Web Sitesi
- Sürüm
- Şu ana kadar Flow Launcher'u {0} kez aktifleştirdiniz.
- Güncellemeleri Kontrol Et
- Uygulamanın yeni sürümü ({0}) mevcut, Lütfen Flow Launcher'u yeniden başlatın.
- Güncelleme kontrolü başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın api.github.com adresine ulaşabilir olduğunu kontrol edin.
-
- Güncellemenin yüklenmesi başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın github-cloud.s3.amazonaws.com
- adresine ulaşabilir olduğunu kontrol edin ya da https://github.com/Flow-Launcher/Flow.Launcher/releases adresinden güncellemeyi elle indirin.
-
- Sürüm Notları:
-
-
- Eski Anahtar Kelime
- Yeni Anahtar Kelime
- İptal
- Tamam
- Belirtilen eklenti bulunamadı
- Yeni anahtar kelime boş olamaz
- Yeni anahtar kelime başka bir eklentiye atanmış durumda. Lütfen başka bir anahtar kelime seçin
- Başarılı
- Anahtar kelime belirlemek istemiyorsanız * kullanın
-
-
- Önizleme
- Kısayol tuşu kullanılabilir değil, lütfen başka bir kısayol tuşu seçin
- Geçersiz eklenti kısayol tuşu
- Güncelle
-
-
- Kısayol tuşu kullanılabilir değil
-
-
- Sürüm
- Tarih
- Sorunu çözebilmemiz için lütfen uygulamanın ne yaparken çöktüğünü belirtin.
- Raporu Gönder
- İptal
- Genel
- Özel Durumlar
- Özel Durum Tipi
- Kaynak
- Yığın İzleme
- Gönderiliyor
- Hata raporu başarıyla gönderildi
- Hata raporu gönderimi başarısız oldu
- Flow Launcher'ta bir hata oluştu
-
-
- Flow Launcher'un yeni bir sürümü ({0}) mevcut
- Güncellemelerin kurulması sırasında bir hata oluştu
- Güncelle
- İptal
- Bu güncelleme Flow Launcher'u yeniden başlatacaktır
- Aşağıdaki dosyalar güncelleştirilecektir
- Güncellenecek dosyalar
- Güncelleme açıklaması
-
-
\ No newline at end of file
+
+
+
+ Kısayol tuşu ataması başarısız oldu: {0}
+ {0} başlatılamıyor
+ Geçersiz Flow Launcher eklenti dosyası formatı
+ Bu sorgu için başa sabitle
+ Sabitlemeyi kaldır
+ Sorguyu çalıştır: {0}
+ Son çalıştırma zamanı: {0}
+ Aç
+ Ayarlar
+ Hakkında
+ Çıkış
+ Kapat
+ Kopyala
+ Kes
+ Yapıştır
+ Undo
+ Select All
+ Dosya
+ Klasör
+ Yazı
+ Oyun Modu
+ Kısayol Tuşlarının kullanımını durdurun.
+ Position Reset
+ Reset search window position
+
+
+ Ayarlar
+ Genel
+ Taşınabilir Mod
+ Tüm ayarları ve kullanıcı verilerini tek bir klasörde saklayın (Çıkarılabilir sürücüler veya bulut hizmetleri ile kullanıldığında kullanışlıdır).
+ Flow Launcher'u başlangıçta başlat
+ Error setting launch on startup
+ Odak pencereden ayrıldığında Flow Launcher'u gizle
+ Güncelleme bildirimlerini gösterme
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Dil
+ Pencere açıldığında
+ Flow Launcher yeniden etkinleştirildiğinde önceki sonuçları göster/gizle.
+ Son sorguyu sakla
+ Son sorguyu sakla ve tümünü seç
+ Sorgu kutusunu temizle
+ Maksimum sonuç sayısı
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Tam ekran modunda kısayol tuşunu gözardı et
+ Tam ekran bir uygulama etkinken Flow Launcher etkinleştirmesini devre dışı bırakın (Oyunlar için önerilir).
+ Varsayılan Dosya Yöneticisi
+ Klasör açarken kullanılacak dosya yöneticisini seçin.
+ Varsayılan Tarayıcısı
+ Yeni Sekme, Yeni Pencere, Gizli Mod için Ayar.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Otomatik Güncelle
+ Seç
+ Başlangıçta Flow Launcher'u gizle
+ Sistem çekmecesi simgesini gizle
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Sorgu Arama Hassasiyeti
+ Sonuçlar için gereken minimum maç puanını değiştirir.
+ Pinyin kullanılmalı
+ Arama yapmak için Pinyin'in kullanılmasına izin verir. Pinyin, Çince'yi çevirmek için standart romanlaştırılmış yazım sistemidir.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Mevcut temada bulanıklık efekti etkinken gölge efektine izin verilmez
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Eklenti
+ Eklenti
+ Daha fazla eklenti bul
+ Açık
+ Devre Dışı
+ Anahtar sözcüğü Ayar eylemi
+ Anahtar Kelimeler
+ Varsayılan anahtar kelime eylemi
+ Yeni anahtar kelime eylemi
+ Anahtar kelime eylemini değiştir
+ Mevcut öncelik
+ Yeni Öncelik
+ Öncelik
+ Change Plugin Results Priority
+ Eklenti Klasörü
+ Yapımcı:
+ Açılış Süresi:
+ Sorgu Süresi:
+ Sürüm
+ İnternet Sitesi
+ Kaldır
+
+
+
+ Eklenti Mağazası
+ New Release
+ Recently Updated
+ Eklentiler
+ Installed
+ Yenile
+ Install
+ Kaldır
+ Güncelle
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Temalar
+ Appearance
+ Daha fazla tema bul
+ Nasıl bir tema yaratılır
+ Merhaba
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Pencere Yazı Tipi
+ Sonuç Yazı Tipi
+ Pencere Modu
+ Saydamlık
+ {0} isimli tema bulunamadı, varsayılan temaya dönülüyor.
+ {0} isimli tema yüklenirken hata oluştu, varsayılan temaya dönülüyor.
+ Tema klasörü
+ Tema Klasörünü Aç
+ Renk düzeni
+ Sistem Varsayılanı
+ Aydınlık
+ Koyu
+ Ses Efekti
+ Arama penceresi açıldığında küçük bir ses oynat
+ Animasyon
+ Arayüzde Animasyon Kullan
+ Clock
+ Date
+
+
+ Kısayol Tuşu
+ Kısayol Tuşu
+ Flow Launcher Kısayolu
+ Enter shortcut to show/hide Flow Launcher.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Açık Sonuç Değiştiricileri
+ Select a modifier key to open selected result via keyboard.
+ Kısayol Tuşunu Göster
+ Show result selection hotkey with results.
+ Özel Sorgu Kısayolları
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Açıklama
+ Sil
+ Düzenle
+ Ekle
+ Lütfen bir öğe seçin
+ {0} eklentisi için olan kısayolu silmek istediğinize emin misiniz?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ Vekil Sunucu
+ HTTP vekil sunucuyu etkinleştir.
+ Sunucu Adresi
+ Port
+ Kullanıcı Adı
+ Parola
+ Ayarları Sına
+ Kaydet
+ Sunucu adresi boş olamaz
+ Port boş olamaz
+ Port biçimi geçersiz
+ Vekil sunucu ayarları başarıyla kaydedildi
+ Vekil sunucu doğru olarak ayarlandı
+ Vekil sunucuya bağlanılırken hata oluştu
+
+
+ Hakkında
+ Website
+ GitHub
+ Docs
+ Sürüm
+ Icons
+ Şu ana kadar Flow Launcher'u {0} kez aktifleştirdiniz.
+ Güncellemeleri Kontrol Et
+ Become A Sponsor
+ Uygulamanın yeni sürümü ({0}) mevcut, Lütfen Flow Launcher'u yeniden başlatın.
+ Güncelleme kontrolü başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın api.github.com adresine ulaşabilir olduğunu kontrol edin.
+
+ Güncellemenin yüklenmesi başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın github-cloud.s3.amazonaws.com
+ adresine ulaşabilir olduğunu kontrol edin ya da https://github.com/Flow-Launcher/Flow.Launcher/releases adresinden güncellemeyi elle indirin.
+
+ Sürüm Notları
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Varsayılan İnternet Tarayıcısı
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Eski Anahtar Kelime
+ Yeni Anahtar Kelime
+ İptal
+ Tamam
+ Belirtilen eklenti bulunamadı
+ Yeni anahtar kelime boş olamaz
+ Yeni anahtar kelime başka bir eklentiye atanmış durumda. Lütfen başka bir anahtar kelime seçin
+ Başarılı
+ Completed successfully
+ Anahtar kelime belirlemek istemiyorsanız * kullanın
+
+
+ Özel Sorgu Kısayolları
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Önizleme
+ Kısayol tuşu kullanılabilir değil, lütfen başka bir kısayol tuşu seçin
+ Geçersiz eklenti kısayol tuşu
+ Güncelle
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Kısayol tuşu kullanılabilir değil
+
+
+ Sürüm
+ Tarih
+ Sorunu çözebilmemiz için lütfen uygulamanın ne yaparken çöktüğünü belirtin.
+ Raporu Gönder
+ İptal
+ Genel
+ Özel Durumlar
+ Özel Durum Tipi
+ Kaynak
+ Yığın İzleme
+ Gönderiliyor
+ Hata raporu başarıyla gönderildi
+ Hata raporu gönderimi başarısız oldu
+ Flow Launcher'ta bir hata oluştu
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Flow Launcher'un yeni bir sürümü ({0}) mevcut
+ Güncellemelerin kurulması sırasında bir hata oluştu
+ Güncelle
+ İptal
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Bu güncelleme Flow Launcher'u yeniden başlatacaktır
+ Aşağıdaki dosyalar güncelleştirilecektir
+ Güncellenecek dosyalar
+ Güncelleme açıklaması
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index 790314d0f..ca989ebe0 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -1,133 +1,367 @@
-
-
- Реєстрація хоткея {0} не вдалася
- Не вдалося запустити {0}
- Невірний формат файлу плагіна Flow Launcher
- Відображати першим при такому ж запиті
- Відмінити відображення першим при такому ж запиті
- Виконати запит: {0}
- Час останнього використання: {0}
- Відкрити
- Налаштування
- Про Flow Launcher
- Закрити
-
-
- Налаштування Flow Launcher
- Основні
- Запускати Flow Launcher при запуску системи
- Сховати Flow Launcher якщо втрачено фокус
- Не повідомляти про доступні нові версії
- Запам'ятати останнє місце запуску
- Мова
- Максимальна кількість результатів
- Ігнорувати гарячі клавіші в повноекранному режимі
- Директорія Python
- Автоматичне оновлення
- Вибрати
- Сховати Flow Launcher при запуску системи
-
-
- Плагіни
- Знайти більше плагінів
- Відключити
- Ключове слово
- Директорія плагіну
- Автор
- Ініціалізація:
- Запит:
-
-
- Теми
- Знайти більше тем
- Шрифт запитів
- Шрифт результатів
- Віконний режим
- Прозорість
-
-
- Гарячі клавіші
- Гаряча клавіша Flow Launcher
- Відкриті модифікатори результатів
- Задані гарячі клавіші для запитів
- Показати клавішу швидкого доступу
- Видалити
- Змінити
- Додати
- Спочатку виберіть елемент
- Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну?
-
-
- HTTP Proxy
- Включити HTTP Proxy
- HTTP Сервер
- Порт
- Логін
- Пароль
- Перевірити Proxy
- Зберегти
- Необхідно вказати "HTTP Сервер"
- Необхідно вказати "Порт"
- Невірний формат порту
- Налаштування Proxy успішно збережено
- Proxy успішно налаштований
- Невдале підключення Proxy
-
-
- Про Flow Launcher
- Сайт
- Версия
- Ви скористалися Flow Launcher вже {0} разів
- Перевірити наявність оновлень
- Доступна нова версія {0}, будь ласка, перезавантажте Flow Launcher
- Примітки до поточного релізу:
-
-
- Поточна гаряча клавіша
- Нова гаряча клавіша
- Скасувати
- Готово
- Не вдалося знайти вказаний плагін
- Нова гаряча клавіша не може бути порожньою
- Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову
- Збережено
- Використовуйте * у разі, якщо ви не хочете ставити конкретну гарячу клавішу
-
-
- Перевірити
- Гаряча клавіша недоступна. Будь ласка, вкажіть нову
- Недійсна гаряча клавіша плагіна
- Оновити
-
-
- Гаряча клавіша недоступна
-
-
- Версія
- Час
- Будь ласка, розкажіть нам, як додаток вийшов із ладу, щоб ми могли це виправити
- Надіслати звіт
- Скасувати
- Основне
- Винятки
- Тип винятку
- Джерело
- Траса стеку
- Відправити
- Звіт успішно відправлено
- Не вдалося відправити звіт
- Стався збій в додатоку Flow Launcher
-
-
- Доступна нова версія Flow Launcher V{0}
- Сталася помилка під час спроби встановити оновлення
- Оновити
- Скасувати
- Це оновлення перезавантажить Flow Launcher
- Ці файли будуть оновлені
- Оновити файли
- Опис оновлення
-
-
\ No newline at end of file
+
+
+
+ Реєстрація хоткея {0} не вдалася
+ Не вдалося запустити {0}
+ Невірний формат файлу плагіна Flow Launcher
+ Відображати першим при такому ж запиті
+ Відмінити відображення першим при такому ж запиті
+ Виконати запит: {0}
+ Час останнього використання: {0}
+ Відкрити
+ Налаштування
+ Про Flow Launcher
+ Вийти
+ Закрити
+ Копіювати
+ Вирізати
+ Вставити
+ Undo
+ Select All
+ Файл
+ Тека
+ Текст
+ Режим гри
+ Призупинити використання гарячих клавіш.
+ Position Reset
+ Reset search window position
+
+
+ Налаштування
+ Основні
+ Портативний режим
+ Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах).
+ Запускати Flow Launcher при запуску системи
+ Error setting launch on startup
+ Сховати Flow Launcher, якщо втрачено фокус
+ Не повідомляти про доступні нові версії
+ Search Window Position
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Мова
+ Останній стиль запиту
+ Показати/приховати попередні результати коли реактивований Flow Launcher знову.
+ Зберегти останній запит
+ Вибрати останній запит
+ Очистити останній запит
+ Максимальна кількість результатів
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ігнорувати гарячі клавіші в повноекранному режимі
+ Вимкнути активацію Flow Launcher коли активовано повноекранний додаток (Рекомендується для ігор).
+ Стандартний Файловий Менеджер
+ Виберіть файловий менеджер для використання під час відкриття теки.
+ Браузер за замовчуванням
+ Налаштування нової вкладки, нового вікна, приватного режиму.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Автоматичне оновлення
+ Вибрати
+ Сховати Flow Launcher при запуску системи
+ Приховати значок в системному лотку
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Точність пошуку запитів
+ Змінює мінімальний бал збігів, необхідних для результатів.
+ Використовувати піньїнь
+ Дозволяє використовувати пінїнь для пошуку. Піньїнь - це стандартна система написання для перекладу китайської.
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Ефект тіні не дозволено, коли поточна тема має ефект розмиття
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Плагіни
+ Знайти більше плагінів
+ Увімкнено
+ Відключити
+ Встановлення гарячих клавіш
+ Ключове слово
+ Поточна гаряча клавіша
+ Нова гаряча клавіша
+ Змінити гарячі клавіши
+ Поточний пріоритет
+ Новий пріоритет
+ Пріоритет
+ Change Plugin Results Priority
+ Директорія плагінів
+ за
+ Ініціалізація:
+ Запит:
+ Версія
+ Сайт
+ Uninstall
+
+
+
+ Магазин плагінів
+ New Release
+ Recently Updated
+ Плагіни
+ Installed
+ Оновити
+ Install
+ Uninstall
+ Оновити
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ Тема
+ Appearance
+ Знайти більше тем
+ Як створити тему
+ Привіт усім
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Шрифт запитів
+ Шрифт результатів
+ Віконний режим
+ Прозорість
+ Тема {0} не існує, повернення до теми за замовчуванням
+ Не вдалось завантажити тему {0}, повернення до теми за замовчуванням
+ Тека з темою
+ Відкрити теку з темою
+ Схема кольорів
+ За замовчуванням
+ Світла
+ Темна
+ Звуковий ефект
+ Відтворювати невеликий звук при відкритті вікна пошуку
+ Анімація
+ Використовувати анімацію в інтерфейсі
+ Clock
+ Date
+
+
+ Гаряча клавіша
+ Гаряча клавіша
+ Гаряча клавіша Flow Launcher
+ Введіть ярлик для відображення/приховання потокового запуску.
+ Preview Hotkey
+ Enter shortcut to show/hide preview in search window.
+ Відкрити ключ зміни результатів
+ Виберіть ключ модифікатора для відкриття вибраних результатів за допомогою клавіатури.
+ Показати гарячу клавішу
+ Show result selection hotkey with results.
+ Задані гарячі клавіші для запитів
+ Custom Query Shortcut
+ Built-in Shortcut
+ Query
+ Shortcut
+ Expansion
+ Description
+ Видалити
+ Редагувати
+ Додати
+ Спочатку виберіть елемент
+ Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Ефект тіні вікна запиту
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+
+
+ HTTP Proxy
+ Включити HTTP Proxy
+ Сервер HTTP
+ Порт
+ Ім'я користувача
+ Пароль
+ Тест Proxy
+ Зберегти
+ Необхідно вказати "HTTP Сервер"
+ Необхідно вказати "Порт"
+ Невірний формат порту
+ Налаштування Proxy успішно збережено
+ Proxy успішно налаштований
+ Невдале підключення Proxy
+
+
+ Про Flow Launcher
+ Website
+ GitHub
+ Docs
+ Версія
+ Icons
+ Ви скористалися Flow Launcher вже {0} разів
+ Перевірити наявність оновлень
+ Become A Sponsor
+ Доступна нова версія {0}, будь ласка, перезавантажте Flow Launcher
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Примітки до поточного релізу:
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ Wizard
+
+
+ Select File Manager
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ File Manager
+ Profile Name
+ File Manager Path
+ Arg For Folder
+ Arg For File
+
+
+ Default Web Browser
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Поточна гаряча клавіша
+ Нова гаряча клавіша
+ Скасувати
+ Готово
+ Не вдалося знайти вказаний плагін
+ Нова гаряча клавіша не може бути порожньою
+ Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову
+ Успішно
+ Completed successfully
+ Введіть гарячу клавішу, яку ви хочете використовувати для запуску плагіна. Використовуйте * у разі, якщо ви не хочете ставити конкретну гарячу клавішу.
+
+
+ Задані гарячі клавіші для запитів
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Переглянути
+ Гаряча клавіша недоступна. Будь ласка, вкажіть нову
+ Недійсна гаряча клавіша плагіна
+ Оновити
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ Гаряча клавіша недоступна
+
+
+ Версія
+ Час
+ Будь ласка, розкажіть нам, як додаток вийшов із ладу, щоб ми могли це виправити
+ Надіслати звіт
+ Скасувати
+ Основні
+ Винятки
+ Тип винятку
+ Джерело
+ Трасування стеку
+ Відправляється
+ Звіт успішно відправлено
+ Не вдалося відправити звіт
+ Стався збій в додатку Flow Launcher
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ Доступна нова версія Flow Launcher {0}
+ Сталася помилка під час спроби встановити оновлення
+ Оновити
+ Скасувати
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Це оновлення перезавантажить Flow Launcher
+ Ці файли будуть оновлені
+ Оновити файли
+ Опис оновлення
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index e404c4deb..346077471 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -13,42 +13,80 @@
关于
退出
关闭
+ 复制
+ 剪切
+ 粘贴
+ 撤销
+ 全选
+ 文件
+ 目录
+ 文本
游戏模式
暂停使用快捷键。
+ 重置位置
+ 重置搜索窗口位置
- Flow Launcher设置
+ 设置
通用
便携模式
将所有设置和用户数据存储在一个文件夹中 (可用于可移除驱动器或云服务)。
开机自启
- 失去焦点时自动隐藏Flow Launcher
+ 设置开机自启时出错
+ 失去焦点时自动隐藏 Flow Launcher
不显示新版本提示
- 记住上次启动位置
+ 搜索窗口位置
+ 记住上次的位置
+ 鼠标光标所在显示器
+ 聚焦窗口所在显示器
+ 主显示器
+ 自定义显示器
+ 搜索窗口在显示器上的位置
+ 中央
+ 顶部居中
+ 左上
+ 右上
+ 自定义位置
语言
再次激活时
- 重启Flow Launcher时显示/隐藏以前的结果。
+ 重启 Flow Launcher 时显示/隐藏以前的结果。
保留上次搜索关键字
选择上次搜索关键字
清空上次搜索关键字
最大结果显示个数
+ 您也可以通过使用 CTRL+ "+" 和 CTRL+ "-" 来快速调整它。
全屏模式下忽略热键
- 当全屏应用程序激活时禁用快捷键。
+ 当全屏应用程序激活时禁用快捷键 (建议游戏时打开) 。
默认文件管理器
选择打开文件夹时要使用的文件管理器。
- Python 路径
+ 默认浏览器
+ 新标签/窗口及隐身模式设置。
+ Python 路径
+ Node.js 路径
+ 请选择 Node.js 可执行文件
+ 请选择 pythonw.exe
+ 以英文模式开始输入
+ 激活 Flow 时暂时将输入法更改为英文模式。
自动更新
- 选择
+ 选择
系统启动时不显示主窗口
隐藏任务栏图标
+ 任务栏图标被隐藏时,右键点击搜索窗口即可打开设置菜单。
查询搜索精度
更改匹配成功所需的最低分数。
- 启动拼音搜索
- 允许使用拼音进行搜索
+ 使用拼音搜索
+ 允许使用拼音进行搜索。
+ 始终打开预览
+ Flow 启动时总是打开预览面板。按 {0} 以切换预览。
当前主题已启用模糊效果,不允许启用阴影效果
+ 搜索插件
+ 按下 Ctrl+F 搜索插件
+ 未找到结果
+ 请尝试搜索不同的内容。
插件
+ 插件
浏览更多插件
启用
禁用
@@ -56,27 +94,51 @@
触发关键字
当前触发关键字
新触发关键字
+ 更改触发关键字
当前优先级
新优先级
优先级
+ 更改插件结果优先级
插件目录
出自
加载耗时:
查询耗时:
- | 版本
+ 版本
官方网站
+ 卸载
插件商店
+ 最新发布
+ 最近更新
+ 插件
+ 已安装
刷新
- 安装
+ 安装
+ 卸载
+ 更新
+ 此插件已安装
+ 新版本
+ 此插件在过去7天内有更新
+ 有可用的更新
+
+
主题
+ 外观
浏览更多主题
如何创建一个主题
你好!
+ 文件管理器
+ 搜索文件、 文件夹和文件内容
+ 网络搜索
+ 使用多个搜索引擎搜索网络
+ 程序
+ 以管理员或其他用户身份启动程序
+ 进程杀手
+ 终止不需要的进程
查询框字体
结果项字体
窗口模式
@@ -93,27 +155,42 @@
启用激活音效
动画
启用动画
+ 时钟
+ 日期
热键
- Flow Launcher激活热键
- 输入显示/隐藏Flow Launcher的快捷键。
- 开放结果修饰符
- 指定修饰符用于打开指定的选项。
+ 热键
+ Flow Launcher 激活热键
+ 输入显示/隐藏 Flow Launcher 的快捷键。
+ 预览快捷键
+ 输入在搜索窗口中开启/关闭预览的快捷键。
+ 打开结果快捷键修饰符
+ 选择一个用以打开搜索结果的按键修饰符。
显示热键
- 显示热键用于快速选择选项。
+ 显示用于打开结果的快捷键。
自定义查询热键
+ 自定义查询捷径
+ 内置捷径
查询
+ 捷径
+ 展开
+ 描述
删除
编辑
- 增加
+ 添加
请选择一项
你确定要删除插件 {0} 的热键吗?
+ 你确定要删除捷径 {0} (展开为 {1})?
+ 从剪贴板获取文本。
+ 从活动的资源管理器窗口获取路径。
查询窗口阴影效果
阴影效果将占用大量的GPU资源。 如果您的计算机性能有限,则不建议使用。
窗口宽度
- 使用Segoe Fluent图标
+ 您也可以使用 Ctrl+[ 和 Ctrl+] 快速调整它。
+ 使用 Segoe Fluent 图标
在支持时在选项中显示 Segoe Fluent 图标
+ 按下按键
HTTP 代理
@@ -133,23 +210,27 @@
关于
- 网站
- Github
+ 官方网站
+ GitHub
文档
版本
- 你已经激活了Flow Launcher {0} 次
+ 图标
+ 你已经激活了 Flow Launcher {0} 次
检查更新
- 发现新版本 {0} , 请重启 Flow Launcher
+ 成为赞助者
+ 发现新版本 {0}, 请重启 Flow Launcher
下载更新失败,请检查您与 api.github.com 的连接状态或检查代理设置
- 下载更新失败,请检查您与 github-cloud.s3.amazonaws.com 的连接状态或检查代理设置,
+ 下载更新失败,请检查您与 github-cloud.s3.amazonaws.com 的连接状态或检查代理设置,
或访问 https://github.com/Flow-Launcher/Flow.Launcher/releases 手动下载更新
- 更新说明:
- 使用技巧:
+ 更新说明
+ 使用技巧
开发工具
设置目录
日志目录
+ 清除日志
+ 你确定要删除所有的日志吗?
向导
@@ -162,6 +243,16 @@
文件夹路径参数
选中文件路径参数
+
+ 默认浏览器
+ 默认设置遵循操作系统默认浏览器设置。如果单独指定,Flow 会使用该浏览器。
+ 浏览器
+ 浏览器名称
+ 浏览器路径
+ 新窗户
+ 新标签
+ 隐身模式
+
更改优先级
数字越大,结果排名越高。如果你想要结果比任何其他插件的低,请使用负数
@@ -180,13 +271,19 @@
如果你不想设置触发关键字,可以使用*代替
- 自定义插件热键
- 按下自定义快捷键激活Flow Launcher并插入指定的查询前缀。
+ 自定义查询热键
+ 输入一个自定义的快捷键来打开 Flow Launcher 并自动输入指定的查询。
预览
热键不可用,请选择一个新的热键
插件热键不合法
更新
+
+ 自定义查询捷径
+ 输入一个捷径,它将自动展开为一个查询。
+ 捷径已存在,请输入一个新的或者编辑已有的。
+ 捷径及其展开均不能为空。
+
热键不可用
@@ -196,7 +293,7 @@
请告诉我们如何重现此问题,以便我们进行修复
发送报告
取消
- 基本信息
+ 通用
异常信息
异常类型
异常源
@@ -204,55 +301,56 @@
发送中
发送成功
发送失败
- Flow Launcher出错啦
+ Flow Launcher 出错啦
请稍等...
-
+
检查新的更新
- 您已经拥有最新的Flow Launcher版本
+ 您已经拥有最新的 Flow Launcher 版本
检查到更新
更新中...
- Flow Launcher无法将您的用户配置文件数据移动到新的更新版本中。
- 请手动将您的用户配置文件数据文件夹从 {0} 到 {1}
+ Flow Launcher 无法将您的用户配置文件数据移动到新的更新版本中。
+ 请手动将您的用户配置文件数据文件夹从 {0} 移动到 {1}
新的更新
- 发现Flow Launcher新版本 V{0}
+ 发现 Flow Launcher 新版本 V{0}
尝试安装软件更新时发生错误
更新
取消
更新失败
检查网络是否可以连接至github-cloud.s3.amazonaws.com.
- 此次更新需要重启Flow Launcher
+ 此次更新需要重启 Flow Launcher
下列文件会被更新
更新文件
更新日志
跳过
- 欢迎使用Flow Launcher
- 你好,这是你第一次运行Flow Launcher!
- 在启动前,这个向导将有助于设置Flow Launcher。如果您愿意,您可以跳过。请选择一种语言
+ 欢迎使用 Flow Launcher
+ 你好,这是你第一次运行 Flow Launcher!
+ 在启动前,这个向导将有助于设置 Flow Launcher。如果您愿意,您可以跳过。请选择一种语言
搜索并运行您PC上的文件和应用程序
- 搜索所有应用程序、 文件、 书签、 YouTube、 Twitter等。所有都只需要键盘而不需要触摸鼠标。
- Flow Launcher默认使用下面的快捷键激活。 要更改它,请点击输入并按键盘上所需的热键。
+ 搜索所有应用程序、 文件、 书签、 YouTube、 Twitter等。所有都只需要键盘而不需要鼠标。
+ Flow Launcher 默认使用下面的快捷键激活。 要更改它,请点击输入并按键盘上所需的热键。
快捷键
动作关键词和命令
- 通过Flow Launcher 插件搜索网站、启动应用程序或运行各种功能。 某些函数起始于一个动作关键词,如有必要,它们可以在没有动作关键词的情况下使用。欢迎尝试一下的查询语句。
- 开始使用Flow Launcher
- 完成了!享受Flow Launcher。不要忘记激活快捷键 :)
+ 通过 Flow Launcher 插件搜索网站、启动应用程序或运行各种功能。某些功能使用一个动作关键词激活,如有必要,它们也可以在没有动作关键词的情况下使用。欢迎尝试以下的查询语句。
+ 开始使用 Flow Launcher
+ 完成了!享受 Flow Launcher。不要忘记激活快捷键 :)
返回/上下文菜单
选项导航
- 打开菜单目录
+ 打开上下文菜单
打开所在目录
- 以管理员身份运行
+ 以管理员身份运行/在默认文件管理器中打开文件夹
查询历史
返回查询界面
+ 自动补全
打开/运行选中项目
打开设置窗口
重新加载插件数据
@@ -261,9 +359,9 @@
谷歌天气结果
> ping 8.8.8.8
命令行命令
- Bluetooth
+ s Bluetooth
Windows 设置中的蓝牙
sn
- Sticky Notes
+ 便笺
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index cba62ead4..5f6878bff 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -1,133 +1,367 @@
-
-
- 登錄快速鍵:{0} 失敗
- 啟動命令 {0} 失敗
- 無效的 Flow Launcher 外掛格式
- 在目前查詢中置頂
- 取消置頂
- 執行查詢:{0}
- 上次執行時間:{0}
- 開啟
- 設定
- 關於
- 結束
-
-
- Flow Launcher 設定
- 一般
- 開機時啟動
- 失去焦點時自動隱藏 Flow Launcher
- 不顯示新版本提示
- 記住上次啟動位置
- 語言
- 最大結果顯示個數
- 全螢幕模式下忽略熱鍵
- Python 路徑
- 自動更新
- 選擇
- 啟動時不顯示主視窗
-
-
- 外掛
- 瀏覽更多外掛
- 停用
- 觸發關鍵字
- 外掛資料夾
- 作者
- 載入耗時:
- 查詢耗時:
-
-
- 主題
- 瀏覽更多主題
- 查詢框字體
- 結果項字體
- 視窗模式
- 透明度
-
-
- 熱鍵
- Flow Launcher 執行熱鍵
- 開放結果修飾符
- 自定義熱鍵查詢
- 顯示熱鍵
- 刪除
- 編輯
- 新增
- 請選擇一項
- 確定要刪除外掛 {0} 的熱鍵嗎?
-
-
- HTTP 代理
- 啟用 HTTP 代理
- HTTP 伺服器
- Port
- 使用者
- 密碼
- 測試代理
- 儲存
- 伺服器不能為空
- Port 不能為空
- 不正確的 Port 格式
- 儲存代理設定成功
- 代理設定完成
- 代理連線失敗
-
-
- 關於
- 網站
- 版本
- 您已經啟動了 Flow Launcher {0} 次
- 檢查更新
- 發現有新版本 {0}, 請重新啟動 Flow Launcher。
- 更新說明:
-
-
- 舊觸發關鍵字
- 新觸發關鍵字
- 取消
- 確定
- 找不到指定的外掛
- 新觸發關鍵字不能為空白
- 新觸發關鍵字已經被指派給另一外掛,請設定其他關鍵字。
- 成功
- 如果不想設定觸發關鍵字,可以使用*代替
-
-
- 預覽
- 熱鍵不存在,請設定一個新的熱鍵
- 外掛熱鍵無法使用
- 更新
-
-
- 熱鍵無法使用
-
-
- 版本
- 時間
- 請告訴我們如何重現此問題,以便我們進行修復
- 發送報告
- 取消
- 基本訊息
- 例外訊息
- 例外類型
- 例外來源
- 堆疊資訊
- 傳送中
- 傳送成功
- 傳送失敗
- Flow Launcher 出錯啦
-
-
- 發現 Flow Launcher 新版本 V{0}
- 更新 Flow Launcher 出錯
- 更新
- 取消
- 此更新需要重新啟動 Flow Launcher
- 下列檔案會被更新
- 更新檔案
- 更新日誌
-
-
+
+
+
+ 登錄快捷鍵:{0} 失敗
+ 啟動命令 {0} 失敗
+ 無效的 Flow Launcher 外掛格式
+ 在目前查詢中置頂
+ 取消置頂
+ 執行查詢:{0}
+ 上次執行時間:{0}
+ 開啟
+ 設定
+ 關於
+ 結束
+ 關閉
+ 複製
+ 剪下
+ 貼上
+ Undo
+ Select All
+ 檔案
+ 資料夾
+ 文字
+ 遊戲模式
+ 暫停使用快捷鍵。
+ Position Reset
+ 重設搜尋視窗位置
+
+
+ 設定
+ 一般
+ 便攜模式
+ 將所有設定和使用者資料存儲在一個資料夾中(當與可移動磁碟或雲服務一起使用時很有用)。
+ 開機時啟動
+ Error setting launch on startup
+ 失去焦點時自動隱藏 Flow Launcher
+ 不顯示新版本提示
+ 搜尋視窗位置
+ 記住最後位置
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ 搜尋視窗在螢幕上的位置
+ Center
+ Center Top
+ Left Top
+ Right Top
+ 自訂搜尋視窗位置
+ 語言
+ 最後查詢樣式
+ 重啟 Flow Launcher 顯示/隱藏以前的結果。
+ 保留上一個查詢
+ 選擇上一個查詢
+ Empty last Query
+ 最大結果顯示個數
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ 全螢幕模式下忽略快捷鍵
+ 全螢幕模式下停用快捷鍵(推薦用於遊戲時)。
+ 預設檔案管理器
+ 選擇開啟資料夾時要使用的檔案管理器。
+ 預設瀏覽器
+ 設定新增分頁、視窗和無痕模式。
+ Python 位置
+ Node.js Path
+ Please select the Node.js executable
+ 請選擇 pythonw.exe
+ 一律以英文模式開始輸入
+ 啟動 Flow 時暫時將輸入法切換為英文模式。
+ 自動更新
+ 選擇
+ 啟動時不顯示主視窗
+ 隱藏任務欄圖標
+ 當圖標從系統列隱藏時,可以透過在搜尋視窗上按右鍵來開啟設定選單。
+ 查詢搜尋精確度
+ 更改結果所需的最低匹配分數。
+ 拼音搜尋
+ 允許使用拼音來搜尋。拼音是將中文轉換為羅馬字母拼寫的標準系統。
+ 一律預覽
+ 當 Flow 啟動時,一律開啟預覽面板。按下 {0} 可切換預覽。
+ Shadow effect is not allowed while current theme has blur effect enabled
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ 插件
+ 插件
+ 瀏覽更多外掛
+ 啟用
+ 停用
+ 觸發關鍵字設定
+ 觸發關鍵字
+ 目前觸發關鍵字
+ 新觸發關鍵字
+ 更改觸發關鍵字
+ 目前優先
+ 新增優先
+ 優先
+ 更改插件結果優先順序
+ 插件資料夾
+ 作者
+ 載入耗時:
+ 查詢耗時:
+ 版本
+ 官方網站
+ 解除安裝
+
+
+
+ 插件商店
+ New Release
+ Recently Updated
+ 外掛
+ Installed
+ 重新整理
+ 安裝
+ 解除安裝
+ 更新
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+
+
+
+
+ 主題
+ 外觀
+ 瀏覽更多主題
+ 如何創建一個主題
+ 你好呀
+ 檔案總管
+ 搜尋檔案、資料夾和檔案內容
+ 網路搜尋
+ Search the web with different search engine support
+ 程式
+ 以系統管理員或其他使用者啟用應用程式
+ ProcessKiller
+ Terminate unwanted processes
+ 查詢框字體
+ 結果項字體
+ 視窗模式
+ 透明度
+ 找不到主題 {0} ,將回到預設主題
+ 無法載入主題 {0} ,將回到預設主題
+ 主題資料夾
+ 打開主題資料夾
+ 顏色主題
+ 系統預設
+ 亮色系
+ 暗色系
+ 音效
+ 搜尋窗口打開時播放音效
+ 動畫
+ 使用介面動畫
+ 時鐘
+ 日期
+
+
+ 快捷鍵
+ 快捷鍵
+ Flow Launcher 快捷鍵
+ 執行縮寫以顯示 / 隱藏 Flow Launcher。
+ 預覽快捷鍵
+ Enter shortcut to show/hide preview in search window.
+ 開放結果修飾符
+ Select a modifier key to open selected result via keyboard.
+ 顯示快捷鍵
+ Show result selection hotkey with results.
+ 自定義查詢快捷鍵
+ 自訂查詢縮寫
+ 內建縮寫
+ 查詢
+ 縮寫
+ 展開
+ 簡介
+ 刪除
+ 編輯
+ 新增
+ 請選擇一項
+ 確定要刪除外掛 {0} 的快捷鍵嗎?
+ 你確定你要刪除縮寫:{0} 展開為 {1}?
+ 從剪貼簿取得文字。
+ 從使用中的檔案總管獲得路徑。
+ 查詢窗口陰影效果
+ 陰影效果將佔用大量的 GPU 資源。如果你的電腦效能有限,不建議使用。
+ 窗口寬度
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ 使用 Segoe Fluent 圖標
+ 在支援的情況下,在查詢結果使用 Segoe Fluent 圖標
+ 按下按鍵
+
+
+ HTTP 代理
+ 啟用 HTTP 代理
+ HTTP 伺服器
+ 埠
+ 使用者
+ 密碼
+ 測試代理
+ 儲存
+ 伺服器不能為空
+ Port 不能為空
+ 不正確的 Port 格式
+ 儲存代理設定成功
+ 代理設定完成
+ 代理連線失敗
+
+
+ 關於
+ 官方網站
+ GitHub
+ 文檔
+ 版本
+ 圖標
+ 您已經啟動了 Flow Launcher {0} 次
+ 檢查更新
+ 成為贊助者
+ 發現有新版本 {0}, 請重新啟動 Flow Launcher。
+ 檢查更新失敗,請檢查你對 api.github.com 的連線和代理設定。
+
+ 下載更新失敗,請檢查您對 github-cloud.s3.amazonaws.com 的連線和代理設定,
+ 或是到 https://github.com/Flow-Launcher/Flow.Launcher/releases 手動下載更新。
+
+ 更新說明
+ 使用技巧
+ 開發工具
+ 設定資料夾
+ 日誌資料夾
+ 清除日誌
+ 請確認要刪除所有日誌嗎?
+ 嚮導
+
+
+ 選擇檔案管理器
+ Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
+ "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ 檔案管理器
+ 檔案名稱
+ 檔案管理器路徑
+ 資料夾參數
+ 檔案參數
+
+
+ 預設瀏覽器
+ 默認設定是依照作業系統的預設瀏覽器設定。如果要指定,Flow 將使用指定的瀏覽器。
+ 瀏覽器
+ 瀏覽器名稱
+ 瀏覽器路徑
+ 新增視窗
+ 新增分頁
+ 無痕模式
+
+
+ 更改優先度
+ 數字越大,查詢結果會排在越前面。嘗試將其設定為 5。如果你希望查詢結果低於任何其他外掛,請提供負數
+ 請為優先度提供一個有效的整數!
+
+
+ 舊觸發關鍵字
+ 新觸發關鍵字
+ 取消
+ 確定
+ 找不到指定的外掛
+ 新觸發關鍵字不能為空白
+ 新觸發關鍵字已經被指派給另一外掛,請設定其他關鍵字。
+ 成功
+ 成功完成
+ 如果不想設定觸發關鍵字,可以使用*代替
+
+
+ 自定義快捷鍵查詢
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ 預覽
+ 快捷鍵不存在,請設定一個新的快捷鍵
+ 外掛熱鍵無法使用
+ 更新
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+
+
+ 快捷鍵無法使用
+
+
+ 版本
+ 時間
+ 請告訴我們如何重現此問題,以便我們進行修復
+ 發送報告
+ 取消
+ 一般
+ 例外訊息
+ 例外類型
+ 例外來源
+ 堆疊資訊
+ 傳送中
+ 傳送成功
+ 傳送失敗
+ Flow Launcher 出錯啦
+
+
+ 請稍後...
+
+
+ 正在檢查更新
+ 您已經擁有最新的 Flow Launcher 版本
+ 找到更新
+ 更新中...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ 新的更新
+ 發現 Flow Launcher 新版本 V{0}
+ 更新 Flow Launcher 時發生錯誤
+ 更新
+ 取消
+ 更新失敗
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ 此更新需要重新啟動 Flow Launcher
+ 下列檔案會被更新
+ 更新檔案
+ 更新日誌
+
+
+ 跳過
+ 歡迎使用 Flow Launcher
+ 你好,這是你第一次運行 Flow Launcher!
+ 在開始之前,此嚮導將幫助設定 Flow Launcher。如果你想,你可以跳過這個。請選擇一種語言
+ 在PC上搜尋並執行所有文件和應用程式
+ 只需使用鍵盤搜尋應用程式、文件、書籤、YouTube、Twitter 等。
+ Flow Launcher 需要搭配快捷鍵使用,請馬上試試吧! 如果想更改它,請點擊"輸入"並輸入你想要的快捷鍵。
+ 快捷鍵
+ 關鍵字與指令
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ 開始使用 Flow Launcher吧!
+ 大功告成! 別忘了使用快捷鍵以開始 :)
+
+
+
+ 返回 / 快捷選單
+ Item Navigation
+ 打開選單
+ Open A File/Folder's Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ 查詢歷史
+ Back to Result in Context Menu
+ 自動完成
+ 開啟/運行選擇項目
+ 開啟視窗設定
+ 重新載入插件資料
+
+ 天氣
+ Google 搜尋的天氣結果
+ > ping 8.8.8.8
+ Shell 指令
+ s 藍牙
+ Windows 設定中的藍牙
+ sn
+ 便利貼
+
+
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 714fcc53f..4a95834b5 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -7,12 +7,13 @@
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
+ xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
Name="FlowMainWindow"
Title="Flow Launcher"
MinWidth="{Binding MainWindowWidth, Mode=OneWay}"
MaxWidth="{Binding MainWindowWidth, Mode=OneWay}"
- d:DataContext="{d:DesignInstance vm:MainViewModel}"
+ d:DataContext="{d:DesignInstance Type=vm:MainViewModel}"
AllowDrop="True"
AllowsTransparency="True"
Background="Transparent"
@@ -36,10 +37,13 @@
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -234,70 +326,170 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 366407182..96b114dac 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
@@ -17,9 +17,13 @@ using DragEventArgs = System.Windows.DragEventArgs;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using NotifyIcon = System.Windows.Forms.NotifyIcon;
using Flow.Launcher.Infrastructure;
-using System.Windows.Media;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Plugin.SharedCommands;
+using System.Windows.Threading;
+using System.Windows.Data;
+using ModernWpf.Controls;
+using Key = System.Windows.Input.Key;
+using System.Media;
namespace Flow.Launcher
{
@@ -33,8 +37,8 @@ namespace Flow.Launcher
private NotifyIcon _notifyIcon;
private ContextMenu contextMenu;
private MainViewModel _viewModel;
- private readonly MediaPlayer animationSound = new();
private bool _animating;
+ SoundPlayer animationSound = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav");
#endregion
@@ -43,15 +47,16 @@ namespace Flow.Launcher
DataContext = mainVM;
_viewModel = mainVM;
_settings = settings;
+
InitializeComponent();
- InitializePosition();
- animationSound.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"));
+ InitializePosition();
}
public MainWindow()
{
InitializeComponent();
}
+
private void OnCopy(object sender, ExecutedRoutedEventArgs e)
{
if (QueryTextBox.SelectionLength == 0)
@@ -64,6 +69,7 @@ namespace Flow.Launcher
_viewModel.ResultCopy(QueryTextBox.SelectedText);
}
}
+
private async void OnClosing(object sender, CancelEventArgs e)
{
_settings.WindowTop = Top;
@@ -89,6 +95,8 @@ namespace Flow.Launcher
InitializeColorScheme();
WindowsInteropHelper.DisableControlBox(this);
InitProgressbarAnimation();
+ InitializePosition();
+ PreviewReset();
// since the default main window visibility is visible
// so we need set focus during startup
QueryTextBox.Focus();
@@ -98,16 +106,17 @@ namespace Flow.Launcher
switch (e.PropertyName)
{
case nameof(MainViewModel.MainWindowVisibilityStatus):
+ {
+ Dispatcher.Invoke(() =>
{
if (_viewModel.MainWindowVisibilityStatus)
{
if (_settings.UseSound)
{
- animationSound.Position = TimeSpan.Zero;
animationSound.Play();
}
-
UpdatePosition();
+ PreviewReset();
Activate();
QueryTextBox.Focus();
_settings.ActivateTimes++;
@@ -123,7 +132,7 @@ namespace Flow.Launcher
isProgressBarStoryboardPaused = false;
}
- if(_settings.UseAnimation)
+ if (_settings.UseAnimation)
WindowAnimator();
}
else if (!isProgressBarStoryboardPaused)
@@ -131,29 +140,27 @@ namespace Flow.Launcher
_progressBarStoryboard.Stop(ProgressBar);
isProgressBarStoryboardPaused = true;
}
-
- break;
- }
+ });
+ break;
+ }
case nameof(MainViewModel.ProgressBarVisibility):
+ {
+ Dispatcher.Invoke(() =>
{
- Dispatcher.Invoke(async () =>
+ if (_viewModel.ProgressBarVisibility == Visibility.Hidden && !isProgressBarStoryboardPaused)
{
- if (_viewModel.ProgressBarVisibility == Visibility.Hidden && !isProgressBarStoryboardPaused)
- {
- await Task.Delay(50);
- _progressBarStoryboard.Stop(ProgressBar);
- isProgressBarStoryboardPaused = true;
- }
- else if (_viewModel.MainWindowVisibilityStatus &&
- isProgressBarStoryboardPaused)
- {
- _progressBarStoryboard.Begin(ProgressBar, true);
- isProgressBarStoryboardPaused = false;
- }
- }, System.Windows.Threading.DispatcherPriority.Render);
-
- break;
- }
+ _progressBarStoryboard.Stop(ProgressBar);
+ isProgressBarStoryboardPaused = true;
+ }
+ else if (_viewModel.MainWindowVisibilityStatus &&
+ isProgressBarStoryboardPaused)
+ {
+ _progressBarStoryboard.Begin(ProgressBar, true);
+ isProgressBarStoryboardPaused = false;
+ }
+ });
+ break;
+ }
case nameof(MainViewModel.QueryTextCursorMovedToEnd):
if (_viewModel.QueryTextCursorMovedToEnd)
{
@@ -161,8 +168,12 @@ namespace Flow.Launcher
_viewModel.QueryTextCursorMovedToEnd = false;
}
break;
+ case nameof(MainViewModel.GameModeStatus):
+ _notifyIcon.Icon = _viewModel.GameModeStatus ? Properties.Resources.gamemode : Properties.Resources.app;
+ break;
}
};
+
_settings.PropertyChanged += (o, e) =>
{
switch (e.PropertyName)
@@ -176,31 +187,62 @@ namespace Flow.Launcher
case nameof(Settings.Hotkey):
UpdateNotifyIconText();
break;
+ case nameof(Settings.WindowLeft):
+ Left = _settings.WindowLeft;
+ break;
+ case nameof(Settings.WindowTop):
+ Top = _settings.WindowTop;
+ break;
}
};
}
private void InitializePosition()
{
- if (_settings.RememberLastLaunchLocation)
+ if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
{
Top = _settings.WindowTop;
Left = _settings.WindowLeft;
}
else
{
- Left = WindowLeft();
- Top = WindowTop();
+ var screen = SelectedScreen();
+ switch (_settings.SearchWindowAlign)
+ {
+ case SearchWindowAligns.Center:
+ Left = HorizonCenter(screen);
+ Top = VerticalCenter(screen);
+ break;
+ case SearchWindowAligns.CenterTop:
+ Left = HorizonCenter(screen);
+ Top = 10;
+ break;
+ case SearchWindowAligns.LeftTop:
+ Left = HorizonLeft(screen);
+ Top = 10;
+ break;
+ case SearchWindowAligns.RightTop:
+ Left = HorizonRight(screen);
+ Top = 10;
+ break;
+ case SearchWindowAligns.Custom:
+ Left = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X + _settings.CustomWindowLeft, 0).X;
+ Top = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y + _settings.CustomWindowTop).Y;
+ break;
+ }
}
+
}
private void UpdateNotifyIconText()
{
var menu = contextMenu;
- ((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")";
- ((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("GameMode");
+ ((MenuItem)menu.Items[0]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")";
+ ((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("GameMode");
+ ((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("PositionReset");
((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
+
}
private void InitializeNotifyIcon()
@@ -211,38 +253,62 @@ namespace Flow.Launcher
Icon = Properties.Resources.app,
Visible = !_settings.HideNotifyIcon
};
+
contextMenu = new ContextMenu();
- var header = new MenuItem
+ var openIcon = new FontIcon
{
- Header = "Flow Launcher",
- IsEnabled = false
+ Glyph = "\ue71e"
};
var open = new MenuItem
{
- Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" +_settings.Hotkey + ")"
+ Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")", Icon = openIcon
+ };
+ var gamemodeIcon = new FontIcon
+ {
+ Glyph = "\ue7fc"
};
var gamemode = new MenuItem
{
- Header = InternationalizationManager.Instance.GetTranslation("GameMode")
+ Header = InternationalizationManager.Instance.GetTranslation("GameMode"), Icon = gamemodeIcon
+ };
+ var positionresetIcon = new FontIcon
+ {
+ Glyph = "\ue73f"
+ };
+ var positionreset = new MenuItem
+ {
+ Header = InternationalizationManager.Instance.GetTranslation("PositionReset"), Icon = positionresetIcon
+ };
+ var settingsIcon = new FontIcon
+ {
+ Glyph = "\ue713"
};
var settings = new MenuItem
{
- Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings")
+ Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings"), Icon = settingsIcon
+ };
+ var exitIcon = new FontIcon
+ {
+ Glyph = "\ue7e8"
};
var exit = new MenuItem
{
- Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit")
+ Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"), Icon = exitIcon
};
open.Click += (o, e) => _viewModel.ToggleFlowLauncher();
- gamemode.Click += (o, e) => ToggleGameMode();
+ gamemode.Click += (o, e) => _viewModel.ToggleGameMode();
+ positionreset.Click += (o, e) => PositionReset();
settings.Click += (o, e) => App.API.OpenSettingDialog();
exit.Click += (o, e) => Close();
- contextMenu.Items.Add(header);
- contextMenu.Items.Add(open);
+
gamemode.ToolTip = InternationalizationManager.Instance.GetTranslation("GameModeToolTip");
+ positionreset.ToolTip = InternationalizationManager.Instance.GetTranslation("PositionResetToolTip");
+
+ contextMenu.Items.Add(open);
contextMenu.Items.Add(gamemode);
+ contextMenu.Items.Add(positionreset);
contextMenu.Items.Add(settings);
contextMenu.Items.Add(exit);
@@ -271,38 +337,35 @@ namespace Flow.Launcher
OpenWelcomeWindow();
}
}
+
private void OpenWelcomeWindow()
{
var WelcomeWindow = new WelcomeWindow(_settings);
WelcomeWindow.Show();
}
- private void ToggleGameMode()
+
+ private async void PositionReset()
{
- if (_viewModel.GameModeStatus)
- {
- _notifyIcon.Icon = Properties.Resources.app;
- _viewModel.GameModeStatus = false;
- }
- else
- {
- _notifyIcon.Icon = Properties.Resources.gamemode;
- _viewModel.GameModeStatus = true;
- }
+ _viewModel.Show();
+ await Task.Delay(300); // If don't give a time, Positioning will be weird.
+ var screen = SelectedScreen();
+ Left = HorizonCenter(screen);
+ Top = VerticalCenter(screen);
}
+
private void InitProgressbarAnimation()
{
- var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 150,
- new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
- var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 50, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
+ var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
+ var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 0, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
_progressBarStoryboard.Children.Add(da);
_progressBarStoryboard.Children.Add(da1);
_progressBarStoryboard.RepeatBehavior = RepeatBehavior.Forever;
-
_viewModel.ProgressBarVisibility = Visibility.Hidden;
isProgressBarStoryboardPaused = true;
}
+
public void WindowAnimator()
{
if (_animating)
@@ -310,11 +373,14 @@ namespace Flow.Launcher
_animating = true;
UpdatePosition();
- Storyboard sb = new Storyboard();
+
+ Storyboard windowsb = new Storyboard();
+ Storyboard clocksb = new Storyboard();
Storyboard iconsb = new Storyboard();
- CircleEase easing = new CircleEase(); // or whatever easing class you want
+ CircleEase easing = new CircleEase();
easing.EasingMode = EasingMode.EaseInOut;
- var da = new DoubleAnimation
+
+ var WindowOpacity = new DoubleAnimation
{
From = 0,
To = 1,
@@ -322,33 +388,76 @@ namespace Flow.Launcher
FillBehavior = FillBehavior.Stop
};
- var da2 = new DoubleAnimation
+ var WindowMotion = new DoubleAnimation
{
From = Top + 10,
To = Top,
Duration = TimeSpan.FromSeconds(0.25),
FillBehavior = FillBehavior.Stop
};
- var da3 = new DoubleAnimation
- {
- From = 12,
- To = 0,
- EasingFunction = easing,
- Duration = TimeSpan.FromSeconds(0.36),
- FillBehavior = FillBehavior.Stop
- };
- Storyboard.SetTarget(da, this);
- Storyboard.SetTargetProperty(da, new PropertyPath(Window.OpacityProperty));
- Storyboard.SetTargetProperty(da2, new PropertyPath(Window.TopProperty));
- Storyboard.SetTargetProperty(da3, new PropertyPath(TopProperty));
- sb.Children.Add(da);
- sb.Children.Add(da2);
- iconsb.Children.Add(da3);
- sb.Completed += (_, _) => _animating = false;
+ var IconMotion = new DoubleAnimation
+ {
+ From = 12,
+ To = 0,
+ EasingFunction = easing,
+ Duration = TimeSpan.FromSeconds(0.36),
+ FillBehavior = FillBehavior.Stop
+ };
+
+ var ClockOpacity = new DoubleAnimation
+ {
+ From = 0,
+ To = 1,
+ EasingFunction = easing,
+ Duration = TimeSpan.FromSeconds(0.36),
+ FillBehavior = FillBehavior.Stop
+ };
+ double TargetIconOpacity = SearchIcon.Opacity; // Animation Target Opacity from Style
+ var IconOpacity = new DoubleAnimation
+ {
+ From = 0,
+ To = TargetIconOpacity,
+ EasingFunction = easing,
+ Duration = TimeSpan.FromSeconds(0.36),
+ FillBehavior = FillBehavior.Stop
+ };
+
+ double right = ClockPanel.Margin.Right;
+ var thicknessAnimation = new ThicknessAnimation
+ {
+ From = new Thickness(0, 12, right, 0),
+ To = new Thickness(0, 0, right, 0),
+ EasingFunction = easing,
+ Duration = TimeSpan.FromSeconds(0.36),
+ FillBehavior = FillBehavior.Stop
+ };
+
+ Storyboard.SetTargetProperty(ClockOpacity, new PropertyPath(OpacityProperty));
+ Storyboard.SetTargetName(thicknessAnimation, "ClockPanel");
+ Storyboard.SetTargetProperty(thicknessAnimation, new PropertyPath(MarginProperty));
+ Storyboard.SetTarget(WindowOpacity, this);
+ Storyboard.SetTargetProperty(WindowOpacity, new PropertyPath(Window.OpacityProperty));
+ Storyboard.SetTargetProperty(WindowMotion, new PropertyPath(Window.TopProperty));
+ Storyboard.SetTargetProperty(IconMotion, new PropertyPath(TopProperty));
+ Storyboard.SetTargetProperty(IconOpacity, new PropertyPath(OpacityProperty));
+
+ clocksb.Children.Add(thicknessAnimation);
+ clocksb.Children.Add(ClockOpacity);
+ windowsb.Children.Add(WindowOpacity);
+ windowsb.Children.Add(WindowMotion);
+ iconsb.Children.Add(IconMotion);
+ iconsb.Children.Add(IconOpacity);
+
+ windowsb.Completed += (_, _) => _animating = false;
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
+
+ if (QueryTextBox.Text.Length == 0)
+ {
+ clocksb.Begin(ClockPanel);
+ }
iconsb.Begin(SearchIcon);
- sb.Begin(FlowMainWindow);
+ windowsb.Begin(FlowMainWindow);
}
private void OnMouseDown(object sender, MouseButtonEventArgs e)
@@ -356,28 +465,6 @@ namespace Flow.Launcher
if (e.ChangedButton == MouseButton.Left) DragMove();
}
- private void OnPreviewMouseButtonDown(object sender, MouseButtonEventArgs e)
- {
- if (sender != null && e.OriginalSource != null)
- {
- var r = (ResultListBox)sender;
- var d = (DependencyObject)e.OriginalSource;
- var item = ItemsControl.ContainerFromElement(r, d) as ListBoxItem;
- var result = (ResultViewModel)item?.DataContext;
- if (result != null)
- {
- if (e.ChangedButton == MouseButton.Left)
- {
- _viewModel.OpenResultCommand.Execute(null);
- }
- else if (e.ChangedButton == MouseButton.Right)
- {
- _viewModel.LoadContextMenuCommand.Execute(null);
- }
- }
- }
- }
-
private void OnPreviewDragOver(object sender, DragEventArgs e)
{
e.Handled = true;
@@ -386,16 +473,17 @@ namespace Flow.Launcher
private async void OnContextMenusForSettingsClick(object sender, RoutedEventArgs e)
{
_viewModel.Hide();
-
- if(_settings.UseAnimation)
+
+ if (_settings.UseAnimation)
await Task.Delay(100);
-
+
App.API.OpenSettingDialog();
}
-
private async void OnDeactivated(object sender, EventArgs e)
{
+ _settings.WindowLeft = Left;
+ _settings.WindowTop = Top;
//This condition stops extra hide call when animator is on,
// which causes the toggling to occasional hide instead of show.
if (_viewModel.MainWindowVisibilityStatus)
@@ -405,8 +493,8 @@ namespace Flow.Launcher
// and always after Settings window is closed.
if (_settings.UseAnimation)
await Task.Delay(100);
-
- if (_settings.HideWhenDeactive)
+
+ if (_settings.HideWhenDeactivated)
{
_viewModel.Hide();
}
@@ -417,24 +505,14 @@ namespace Flow.Launcher
{
if (_animating)
return;
-
- if (_settings.RememberLastLaunchLocation)
- {
- Left = _settings.WindowLeft;
- Top = _settings.WindowTop;
- }
- else
- {
- Left = WindowLeft();
- Top = WindowTop();
- }
+ InitializePosition();
}
private void OnLocationChanged(object sender, EventArgs e)
{
if (_animating)
return;
- if (_settings.RememberLastLaunchLocation)
+ if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
{
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
@@ -454,30 +532,72 @@ namespace Flow.Launcher
}
}
- public double WindowLeft()
+ public Screen SelectedScreen()
+ {
+ Screen screen = null;
+ switch(_settings.SearchWindowScreen)
+ {
+ case SearchWindowScreens.Cursor:
+ screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ break;
+ case SearchWindowScreens.Primary:
+ screen = Screen.PrimaryScreen;
+ break;
+ case SearchWindowScreens.Focus:
+ IntPtr foregroundWindowHandle = WindowsInteropHelper.GetForegroundWindow();
+ screen = Screen.FromHandle(foregroundWindowHandle);
+ break;
+ case SearchWindowScreens.Custom:
+ if (_settings.CustomScreenNumber <= Screen.AllScreens.Length)
+ screen = Screen.AllScreens[_settings.CustomScreenNumber - 1];
+ else
+ screen = Screen.AllScreens[0];
+ break;
+ default:
+ screen = Screen.AllScreens[0];
+ break;
+ }
+ return screen ?? Screen.AllScreens[0];
+ }
+
+ public double HorizonCenter(Screen screen)
{
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
var left = (dip2.X - ActualWidth) / 2 + dip1.X;
return left;
}
- public double WindowTop()
+ public double VerticalCenter(Screen screen)
{
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
var top = (dip2.Y - QueryTextBox.ActualHeight) / 4 + dip1.Y;
return top;
}
+ public double HorizonRight(Screen screen)
+ {
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
+ var left = (dip1.X + dip2.X - ActualWidth) - 10;
+ return left;
+ }
+
+ public double HorizonLeft(Screen screen)
+ {
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
+ var left = dip1.X + 10;
+ return left;
+ }
+
///
/// Register up and down key
/// todo: any way to put this in xaml ?
///
private void OnKeyDown(object sender, KeyEventArgs e)
{
+ var specialKeyState = GlobalHotkey.CheckModifiers();
switch (e.Key)
{
case Key.Down:
@@ -513,15 +633,15 @@ namespace Flow.Launcher
}
break;
case Key.Back:
- var specialKeyState = GlobalHotkey.CheckModifiers();
if (specialKeyState.CtrlPressed)
{
if (_viewModel.SelectedIsFromQueryResults()
+ && QueryTextBox.Text.Length > 0
&& QueryTextBox.CaretIndex == QueryTextBox.Text.Length)
{
- var queryWithoutActionKeyword =
- QueryBuilder.Build(QueryTextBox.Text.Trim(), PluginManager.NonGlobalPlugins).Search;
-
+ var queryWithoutActionKeyword =
+ QueryBuilder.Build(QueryTextBox.Text.Trim(), PluginManager.NonGlobalPlugins)?.Search;
+
if (FilesFolders.IsLocationPathString(queryWithoutActionKeyword))
{
_viewModel.BackspaceCommand.Execute(null);
@@ -536,8 +656,15 @@ namespace Flow.Launcher
}
}
+ public void PreviewReset()
+ {
+ _viewModel.ResetPreview();
+ }
+
private void MoveQueryTextToEnd()
{
+ // QueryTextBox seems to be update with a DispatcherPriority as low as ContextIdle.
+ // To ensure QueryTextBox is up to date with QueryText from the View, we need to Dispatch with such a priority
Dispatcher.Invoke(() => QueryTextBox.CaretIndex = QueryTextBox.Text.Length);
}
@@ -552,5 +679,14 @@ namespace Flow.Launcher
ModernWpf.ThemeManager.Current.ApplicationTheme = ModernWpf.ApplicationTheme.Dark;
}
}
+
+ private void QueryTextBox_KeyUp(object sender, KeyEventArgs e)
+ {
+ if (_viewModel.QueryText != QueryTextBox.Text)
+ {
+ BindingExpression be = QueryTextBox.GetBindingExpression(System.Windows.Controls.TextBox.TextProperty);
+ be.UpdateSource();
+ }
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/Msg.xaml.cs b/Flow.Launcher/Msg.xaml.cs
index 6bb2fc2dc..1be89d716 100644
--- a/Flow.Launcher/Msg.xaml.cs
+++ b/Flow.Launcher/Msg.xaml.cs
@@ -38,10 +38,16 @@ namespace Flow.Launcher
Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath(TopProperty));
fadeOutStoryboard.Children.Add(fadeOutAnimation);
- imgClose.Source = ImageLoader.Load(Path.Combine(Infrastructure.Constant.ProgramDirectory, "Images\\close.png"));
+ _ = LoadImageAsync();
+
imgClose.MouseUp += imgClose_MouseUp;
}
+ private async System.Threading.Tasks.Task LoadImageAsync()
+ {
+ imgClose.Source = await ImageLoader.LoadAsync(Path.Combine(Infrastructure.Constant.ProgramDirectory, "Images\\close.png"));
+ }
+
void imgClose_MouseUp(object sender, MouseButtonEventArgs e)
{
if (!closing)
@@ -56,7 +62,7 @@ namespace Flow.Launcher
Close();
}
- public void Show(string title, string subTitle, string iconPath)
+ public async void Show(string title, string subTitle, string iconPath)
{
tbTitle.Text = title;
tbSubTitle.Text = subTitle;
@@ -66,15 +72,15 @@ namespace Flow.Launcher
}
if (!File.Exists(iconPath))
{
- imgIco.Source = ImageLoader.Load(Path.Combine(Constant.ProgramDirectory, "Images\\app.png"));
+ imgIco.Source = await ImageLoader.LoadAsync(Path.Combine(Constant.ProgramDirectory, "Images\\app.png"));
}
else {
- imgIco.Source = ImageLoader.Load(iconPath);
+ imgIco.Source = await ImageLoader.LoadAsync(iconPath);
}
Show();
- Dispatcher.InvokeAsync(async () =>
+ await Dispatcher.InvokeAsync(async () =>
{
if (!closing)
{
diff --git a/Flow.Launcher/Notification.cs b/Flow.Launcher/Notification.cs
index 3f5565eeb..57c1e88f2 100644
--- a/Flow.Launcher/Notification.cs
+++ b/Flow.Launcher/Notification.cs
@@ -18,7 +18,7 @@ namespace Flow.Launcher
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "")]
- public static void Show(string title, string subTitle, string iconPath)
+ public static void Show(string title, string subTitle, string iconPath = null)
{
// Handle notification for win7/8/early win10
if (legacy)
@@ -45,4 +45,4 @@ namespace Flow.Launcher
msg.Show(title, subTitle, iconPath);
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/PriorityChangeWindow.xaml b/Flow.Launcher/PriorityChangeWindow.xaml
index d50bf82db..c917eeffc 100644
--- a/Flow.Launcher/PriorityChangeWindow.xaml
+++ b/Flow.Launcher/PriorityChangeWindow.xaml
@@ -63,7 +63,6 @@
+
FileSystem
Release
Any CPU
- net5.0-windows10.0.19041.0
+ net7.0-windows10.0.19041.0
..\Output\Release\
win-x64
true
@@ -15,4 +15,4 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
False
False
-
\ No newline at end of file
+
diff --git a/Flow.Launcher/Properties/PublishProfiles/NetCore3.1-SelfContained.pubxml.user b/Flow.Launcher/Properties/PublishProfiles/NetCore3.1-SelfContained.pubxml.user
deleted file mode 100644
index 312c6e3b8..000000000
--- a/Flow.Launcher/Properties/PublishProfiles/NetCore3.1-SelfContained.pubxml.user
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.da-DK.resx b/Flow.Launcher/Properties/Resources.da-DK.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.da-DK.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.de-DE.resx b/Flow.Launcher/Properties/Resources.de-DE.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.de-DE.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.es-419.resx b/Flow.Launcher/Properties/Resources.es-419.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.es-419.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.es-EM.resx b/Flow.Launcher/Properties/Resources.es-EM.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.es-EM.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.fr-FR.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.it-IT.resx b/Flow.Launcher/Properties/Resources.it-IT.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.it-IT.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.ja-JP.resx b/Flow.Launcher/Properties/Resources.ja-JP.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.ja-JP.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.ko-KR.resx b/Flow.Launcher/Properties/Resources.ko-KR.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.ko-KR.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.nb-NO.resx b/Flow.Launcher/Properties/Resources.nb-NO.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.nb-NO.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.nl-NL.resx b/Flow.Launcher/Properties/Resources.nl-NL.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.nl-NL.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.pl-PL.resx b/Flow.Launcher/Properties/Resources.pl-PL.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.pl-PL.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.pt-BR.resx b/Flow.Launcher/Properties/Resources.pt-BR.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.pt-BR.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.pt-PT.resx b/Flow.Launcher/Properties/Resources.pt-PT.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.pt-PT.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.ru-RU.resx b/Flow.Launcher/Properties/Resources.ru-RU.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.ru-RU.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.sk-SK.resx b/Flow.Launcher/Properties/Resources.sk-SK.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.sk-SK.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.sr-CS.resx b/Flow.Launcher/Properties/Resources.sr-CS.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.sr-CS.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.tr-TR.resx b/Flow.Launcher/Properties/Resources.tr-TR.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.tr-TR.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.uk-UA.resx b/Flow.Launcher/Properties/Resources.uk-UA.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.uk-UA.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.zh-TW.resx b/Flow.Launcher/Properties/Resources.zh-TW.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.zh-TW.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.zh-cn.resx b/Flow.Launcher/Properties/Resources.zh-cn.resx
new file mode 100644
index 000000000..b5e00e8a2
--- /dev/null
+++ b/Flow.Launcher/Properties/Resources.zh-cn.resx
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index e3b7de31d..ec997f537 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
@@ -23,7 +23,6 @@ using System.Runtime.CompilerServices;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.Storage;
using System.Collections.Concurrent;
-using Flow.Launcher.Plugin.SharedCommands;
using System.Diagnostics;
namespace Flow.Launcher
@@ -83,7 +82,7 @@ namespace Flow.Launcher
ImageLoader.Save();
}
- public Task ReloadAllPluginData() => PluginManager.ReloadData();
+ public Task ReloadAllPluginData() => PluginManager.ReloadDataAsync();
public void ShowMsgError(string title, string subTitle = "") =>
ShowMsg(title, subTitle, Constant.ErrorIcon, true);
@@ -142,6 +141,8 @@ namespace Flow.Launcher
public void AddActionKeyword(string pluginId, string newActionKeyword) =>
PluginManager.AddActionKeyword(pluginId, newActionKeyword);
+ public bool ActionKeywordAssigned(string actionKeyword) => PluginManager.ActionKeywordRegistered(actionKeyword);
+
public void RemoveActionKeyword(string pluginId, string oldActionKeyword) =>
PluginManager.RemoveActionKeyword(pluginId, oldActionKeyword);
@@ -194,24 +195,26 @@ namespace Flow.Launcher
((PluginJsonStorage)_pluginJsonStorages[type]).Save();
}
- public void OpenDirectory(string DirectoryPath, string FileName = null)
+ public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null)
{
using var explorer = new Process();
var explorerInfo = _settingsVM.Settings.CustomExplorer;
explorer.StartInfo = new ProcessStartInfo
{
FileName = explorerInfo.Path,
- Arguments = FileName is null ?
- explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) :
- explorerInfo.FileArgument.Replace("%d", DirectoryPath).Replace("%f",
- Path.IsPathRooted(FileName) ? FileName : Path.Combine(DirectoryPath, FileName))
+ Arguments = FileNameOrFilePath is null
+ ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath)
+ : explorerInfo.FileArgument
+ .Replace("%d", DirectoryPath)
+ .Replace("%f",
+ Path.IsPathRooted(FileNameOrFilePath) ? FileNameOrFilePath : Path.Combine(DirectoryPath, FileNameOrFilePath)
+ )
};
explorer.Start();
}
- public void OpenUri(string url, bool? inPrivate = null, bool isAppUri = false)
+ private void OpenUri(Uri uri, bool? inPrivate = null)
{
- var uri = new Uri(url);
if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
{
var browserInfo = _settingsVM.Settings.CustomBrowser;
@@ -220,38 +223,43 @@ namespace Flow.Launcher
if (browserInfo.OpenInTab)
{
- url.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ uri.AbsoluteUri.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
}
else
{
- url.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ uri.AbsoluteUri.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
}
-
- return;
}
-
- if (isAppUri)
+ else
{
Process.Start(new ProcessStartInfo()
{
- FileName = url,
+ FileName = uri.AbsoluteUri,
UseShellExecute = true
})?.Dispose();
return;
}
-
- throw new InvalidOperationException("URI scheme not specified or supported ");
}
public void OpenUrl(string url, bool? inPrivate = null)
+ {
+ OpenUri(new Uri(url), inPrivate);
+ }
+
+ public void OpenUrl(Uri url, bool? inPrivate = null)
{
OpenUri(url, inPrivate);
}
public void OpenAppUri(string appUri)
{
- OpenUri(appUri, isAppUri: true);
+ OpenUri(new Uri(appUri));
+ }
+
+ public void OpenAppUri(Uri appUri)
+ {
+ OpenUri(appUri);
}
public event FlowLauncherGlobalKeyboardEventHandler GlobalKeyboardEvent;
@@ -282,4 +290,4 @@ namespace Flow.Launcher
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/ReportWindow.xaml.cs b/Flow.Launcher/ReportWindow.xaml.cs
index 6a9fd60e0..4899edc14 100644
--- a/Flow.Launcher/ReportWindow.xaml.cs
+++ b/Flow.Launcher/ReportWindow.xaml.cs
@@ -1,4 +1,5 @@
-using System;
+using Flow.Launcher.Core.ExternalPlugins;
+using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
@@ -22,13 +23,34 @@ namespace Flow.Launcher
SetException(exception);
}
+ private static string GetIssueUrl(string website)
+ {
+ if (!website.StartsWith("https://github.com"))
+ {
+ return website;
+ }
+ if(website.Contains("Flow-Launcher/Flow.Launcher"))
+ {
+ return Constant.Issue;
+ }
+ var treeIndex = website.IndexOf("tree", StringComparison.Ordinal);
+ return treeIndex == -1 ? $"{website}/issues/new" : $"{website[..treeIndex]}/issues/new";
+ }
+
private void SetException(Exception exception)
{
string path = Log.CurrentLogDirectory;
var directory = new DirectoryInfo(path);
var log = directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
- var paragraph = Hyperlink("Please open new issue in: ", Constant.Issue);
+ var websiteUrl = exception switch
+ {
+ FlowPluginException pluginException =>GetIssueUrl(pluginException.Metadata.Website),
+ _ => Constant.Issue
+ };
+
+
+ var paragraph = Hyperlink("Please open new issue in: ", websiteUrl);
paragraph.Inlines.Add($"1. upload log file: {log.FullName}\n");
paragraph.Inlines.Add($"2. copy below exception message");
ErrorTextbox.Document.Blocks.Add(paragraph);
@@ -49,10 +71,12 @@ namespace Flow.Launcher
var paragraph = new Paragraph();
paragraph.Margin = new Thickness(0);
- var link = new Hyperlink { IsEnabled = true };
+ var link = new Hyperlink
+ {
+ IsEnabled = true
+ };
link.Inlines.Add(url);
link.NavigateUri = new Uri(url);
- link.RequestNavigate += (s, e) => SearchWeb.OpenInBrowserTab(e.Uri.ToString());
link.Click += (s, e) => SearchWeb.OpenInBrowserTab(url);
paragraph.Inlines.Add(textBeforeUrl);
@@ -62,4 +86,4 @@ namespace Flow.Launcher
return paragraph;
}
}
-}
+}
\ No newline at end of file
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index b4d7e78a7..505b7c2a3 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -4,6 +4,30 @@
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.modernwpf.com/2019">
+
+
+
+
+
+
+
+
@@ -1358,7 +1381,13 @@
-
+
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml
index 445e07c63..548a1f3a2 100644
--- a/Flow.Launcher/Resources/Dark.xaml
+++ b/Flow.Launcher/Resources/Dark.xaml
@@ -59,16 +59,20 @@
+
-
+
+
+ #272727
+
#202020
#2b2b2b
#1d1d1d
diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml
index cee8b63cd..517a5fd5d 100644
--- a/Flow.Launcher/Resources/Light.xaml
+++ b/Flow.Launcher/Resources/Light.xaml
@@ -51,17 +51,22 @@
+
+
-
+
+
+ #f6f6f6
+
#f3f3f3
#ffffff
#e5e5e5
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
index a433611f6..e89a7dd03 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
@@ -27,7 +27,7 @@ namespace Flow.Launcher.Resources.Pages
tbMsgTextOriginal = HotkeyControl.tbMsg.Text;
tbMsgForegroundColorOriginal = HotkeyControl.tbMsg.Foreground;
- HotkeyControl.SetHotkey(new Infrastructure.Hotkey.HotkeyModel(Settings.Hotkey), false);
+ HotkeyControl.SetHotkeyAsync(Settings.Hotkey, false);
}
private void HotkeyControl_OnGotFocus(object sender, RoutedEventArgs args)
{
@@ -49,4 +49,4 @@ namespace Flow.Launcher.Resources.Pages
HotkeyControl.tbMsg.Foreground = tbMsgForegroundColorOriginal;
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml
index b96abca95..ba4c9e9a4 100644
--- a/Flow.Launcher/ResultListBox.xaml
+++ b/Flow.Launcher/ResultListBox.xaml
@@ -7,7 +7,6 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
MaxHeight="{Binding MaxHeight}"
- Margin="{Binding Margin}"
HorizontalContentAlignment="Stretch"
d:DataContext="{d:DesignInstance vm:ResultsViewModel}"
d:DesignHeight="100"
@@ -17,6 +16,10 @@
ItemsSource="{Binding Results}"
KeyboardNavigation.DirectionalNavigation="Cycle"
PreviewMouseDown="ListBox_PreviewMouseDown"
+ PreviewMouseLeftButtonDown="ResultList_PreviewMouseLeftButtonDown"
+ PreviewMouseLeftButtonUp="ResultListBox_OnPreviewMouseUp"
+ PreviewMouseMove="ResultList_MouseMove"
+ PreviewMouseRightButtonDown="ResultListBox_OnPreviewMouseRightButtonDown"
SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
SelectionChanged="OnSelectionChanged"
@@ -24,13 +27,17 @@
Style="{DynamicResource BaseListboxStyle}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
- Visibility="{Binding Visbility}"
+ Visibility="{Binding Visibility}"
mc:Ignorable="d">
+
+
+
+
-
+
@@ -39,7 +46,7 @@
@@ -49,21 +56,22 @@
-
-
-
+
+
+
@@ -76,49 +84,103 @@
-
-
-
-
-
+
+
+
+
+
+
-
+ Style="{DynamicResource BulletStyle}" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HorizontalAlignment="Stretch"
+ VerticalAlignment="Center">
-
+
-
+
+
+
+
+
+ TextTrimming="CharacterEllipsis"
+ ToolTip="{Binding ShowTitleToolTip}"
+ ToolTipService.ShowOnDisabled="True">
@@ -129,13 +191,12 @@
-
-
-
+ TextTrimming="CharacterEllipsis"
+ ToolTip="{Binding ShowSubTitleToolTip}"
+ ToolTipService.ShowOnDisabled="True" />
@@ -144,10 +205,11 @@
+
-
+
@@ -157,7 +219,7 @@
-
+
\ No newline at end of file
diff --git a/Flow.Launcher/ResultListBox.xaml.cs b/Flow.Launcher/ResultListBox.xaml.cs
index fd980e016..78720e86a 100644
--- a/Flow.Launcher/ResultListBox.xaml.cs
+++ b/Flow.Launcher/ResultListBox.xaml.cs
@@ -1,6 +1,9 @@
-using System.Windows;
+using System;
+using System.IO;
+using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher
{
@@ -14,6 +17,36 @@ namespace Flow.Launcher
InitializeComponent();
}
+ public static readonly DependencyProperty RightClickResultCommandProperty =
+ DependencyProperty.Register("RightClickResultCommand", typeof(ICommand), typeof(ResultListBox), new UIPropertyMetadata(null));
+
+ public ICommand RightClickResultCommand
+ {
+ get
+ {
+ return (ICommand)GetValue(RightClickResultCommandProperty);
+ }
+ set
+ {
+ SetValue(RightClickResultCommandProperty, value);
+ }
+ }
+
+ public static readonly DependencyProperty LeftClickResultCommandProperty =
+ DependencyProperty.Register("LeftClickResultCommand", typeof(ICommand), typeof(ResultListBox), new UIPropertyMetadata(null));
+
+ public ICommand LeftClickResultCommand
+ {
+ get
+ {
+ return (ICommand)GetValue(LeftClickResultCommandProperty);
+ }
+ set
+ {
+ SetValue(LeftClickResultCommandProperty, value);
+ }
+ }
+
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0 && e.AddedItems[0] != null)
@@ -24,7 +57,7 @@ namespace Flow.Launcher
private void OnMouseEnter(object sender, MouseEventArgs e)
{
- lock(_lock)
+ lock (_lock)
{
curItem = (ListBoxItem)sender;
var p = e.GetPosition((IInputElement)sender);
@@ -34,7 +67,7 @@ namespace Flow.Launcher
private void OnMouseMove(object sender, MouseEventArgs e)
{
- lock(_lock)
+ lock (_lock)
{
var p = e.GetPosition((IInputElement)sender);
if (_lastpos != p)
@@ -46,7 +79,7 @@ namespace Flow.Launcher
private void ListBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
- lock(_lock)
+ lock (_lock)
{
if (curItem != null)
{
@@ -54,5 +87,81 @@ namespace Flow.Launcher
}
}
}
+
+
+ private Point start;
+ private string path;
+ private string query;
+ // this method is called by the UI thread, which is single threaded, so we can be sloppy with locking
+ private bool isDragging;
+
+ private void ResultList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (Mouse.DirectlyOver is not FrameworkElement
+ {
+ DataContext: ResultViewModel
+ {
+ Result:
+ {
+ CopyText: { } copyText,
+ OriginQuery.RawQuery: { } rawQuery
+ }
+ }
+ }) return;
+
+ path = copyText;
+ query = rawQuery;
+ start = e.GetPosition(null);
+ isDragging = true;
+ }
+ private void ResultList_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.LeftButton != MouseButtonState.Pressed || !isDragging)
+ {
+ start = default;
+ path = string.Empty;
+ query = string.Empty;
+ isDragging = false;
+ return;
+ }
+
+ if (!File.Exists(path) && !Directory.Exists(path))
+ return;
+
+ Point mousePosition = e.GetPosition(null);
+ Vector diff = this.start - mousePosition;
+
+ if (Math.Abs(diff.X) < SystemParameters.MinimumHorizontalDragDistance
+ || Math.Abs(diff.Y) < SystemParameters.MinimumVerticalDragDistance)
+ return;
+
+ isDragging = false;
+
+ var data = new DataObject(DataFormats.FileDrop, new[]
+ {
+ path
+ });
+
+ // Reassigning query to a new variable because for some reason
+ // after DragDrop.DoDragDrop call, 'query' loses its content, i.e. becomes empty string
+ var rawQuery = query;
+ var effect = DragDrop.DoDragDrop((DependencyObject)sender, data, DragDropEffects.Move | DragDropEffects.Copy);
+ if (effect == DragDropEffects.Move)
+ App.API.ChangeQuery(rawQuery, true);
+ }
+ private void ResultListBox_OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result })
+ return;
+
+ RightClickResultCommand?.Execute(result.Result);
+ }
+ private void ResultListBox_OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
+ {
+ if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result })
+ return;
+
+ LeftClickResultCommand?.Execute(null);
+ }
}
}
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml
index 98bc391dd..d8807dbef 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml
+++ b/Flow.Launcher/SelectBrowserWindow.xaml
@@ -62,7 +62,6 @@
+
-
-
-
-
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -654,7 +830,11 @@
-
+
@@ -664,15 +844,17 @@
-
-
+
+
-
+
-
+
@@ -772,11 +954,13 @@
BorderThickness="0"
Style="{DynamicResource SettingGroupBox}">
-
+
+
+
+
-
+
+ Text="{Binding Settings.PluginSettings.PythonExecutablePath, TargetNullValue='None'}" />
+ Margin="10,0,18,0"
+ Click="OnSelectPythonPathClick"
+ Content="{DynamicResource select}" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -873,12 +1115,15 @@
ItemsSource="{Binding Languages}"
SelectedValue="{Binding Language}"
SelectedValuePath="LanguageCode" />
+
+
+
-
+
-
+
@@ -891,7 +1136,7 @@
+ Text="{DynamicResource plugins}" />
@@ -903,13 +1148,68 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+ SnapsToDevicePixels="True"
+ Style="{DynamicResource PluginListStyle}"
+ VirtualizingPanel.ScrollUnit="Pixel"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.VirtualizationMode="Recycling">
-
+
@@ -939,65 +1244,62 @@
x:Name="expanderHeader"
Grid.Column="4"
Padding="0"
- Background="Transparent"
- FlowDirection="RightToLeft"
- IsExpanded="{Binding Mode=TwoWay, Path=IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem, Mode=FindAncestor}}"
+ BorderThickness="0"
+ ClipToBounds="True"
+ IsExpanded="{Binding Mode=TwoWay, Path=IsExpanded}"
+ SnapsToDevicePixels="True"
Style="{StaticResource ExpanderStyle1}">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ToolTip="{DynamicResource priorityToolTip}">
+
+
+
+
-
+
+ CornerRadius="0 0 5 5"
+ Style="{DynamicResource SettingGroupBox}">
-
-
-
-
-
-
-
-
-
+ FontSize="11"
+ Foreground="{DynamicResource PluginInfoColor}"
+ Text="|" />
+
+
+
-
+ RequestNavigate="OnRequestNavigate"
+ Style="{DynamicResource HyperLinkBtnStyle}"
+ TextDecorations="None">
+
-
+ MouseUp="OnExternalPluginUninstallClick"
+ Style="{DynamicResource LinkBtnStyle}"
+ Text=""
+ ToolTip="{DynamicResource plugin_uninstall}" />
+
+
+
+
+
-
-
-
-
-
+
@@ -1271,224 +1547,325 @@
Text="{DynamicResource pluginStore}"
TextAlignment="left" />
-
+ Margin="5,24,0,0">
+
+
+
+
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Margin="4,0,0,0"
+ Padding="0,0,18,0"
+ ItemContainerStyle="{StaticResource StoreList}"
+ ItemsSource="{Binding Source={StaticResource PluginStoreCollectionView}}"
+ ScrollViewer.HorizontalScrollBarVisibility="Disabled"
+ SelectionMode="Single"
+ Style="{DynamicResource StoreListStyle}"
+ VirtualizingPanel.CacheLength="1,1"
+ VirtualizingPanel.CacheLengthUnit="Page"
+ VirtualizingPanel.IsVirtualizingWhenGrouping="True"
+ VirtualizingPanel.ScrollUnit="Pixel"
+ VirtualizingPanel.VirtualizationMode="Standard">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
-
+
@@ -1501,14 +1878,16 @@
+ Text="{DynamicResource appearance}" />
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
@@ -1522,7 +1901,7 @@
Margin="0,5,0,5"
FontSize="30"
Style="{StaticResource PageTitle}"
- Text="{DynamicResource theme}"
+ Text="{DynamicResource appearance}"
TextAlignment="left" />
@@ -1535,7 +1914,12 @@
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
-
+
@@ -1546,17 +1930,34 @@
-
+
-
+
+
+
+
-
+
@@ -1606,10 +2010,11 @@
+
@@ -1635,9 +2041,25 @@
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -1792,6 +2214,7 @@
Margin="20,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
+ IsSynchronizedWithCurrentItem="False"
ItemsSource="{Binding Source={StaticResource SortedFonts}}"
SelectedItem="{Binding SelectedQueryBoxFont}" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1951,7 +2464,7 @@
-
+
@@ -1969,6 +2482,16 @@
+
+
+
+
+
+
+
@@ -1977,7 +2500,7 @@
-
+
@@ -1990,33 +2513,27 @@
+ Text="{DynamicResource hotkeys}" />
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
-
-
-
-
-
-
-
-
-
+
-
+
@@ -2042,8 +2559,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2090,26 +2633,26 @@
Text="{DynamicResource showOpenResultHotkey}" />
-
+ IsOn="{Binding Settings.ShowOpenResultHotkey}"
+ Style="{DynamicResource SideToggleSwitch}" />
-
+
@@ -2137,7 +2680,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -2183,7 +2824,9 @@
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
@@ -2214,7 +2857,10 @@
VerticalAlignment="Center"
Style="{DynamicResource SettingTitleLabel}"
Text="{DynamicResource enableProxy}" />
-
+
-
+
@@ -2355,7 +3001,9 @@
+ ScrollViewer.CanContentScroll="True"
+ VirtualizingStackPanel.IsVirtualizing="True"
+ VirtualizingStackPanel.ScrollUnit="Pixel">
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Click="OnCheckUpdates"
+ Content="{DynamicResource checkUpdates}" />
+
+
+
-
-
-
-
-
-
+
+
-
+
@@ -2458,6 +3073,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2465,7 +3110,7 @@
@@ -2485,6 +3130,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2496,34 +3164,44 @@
HorizontalAlignment="Right"
Orientation="Horizontal">
+ Click="ClearLogFolder"
+ Content="{Binding CheckLogFolder, Mode=OneWay}" />
-
+ Margin="0,0,8,0"
+ Content=""
+ FontFamily="/Resources/#Segoe Fluent Icons"
+ FontSize="20">
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index 15babee8b..f39974142 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -1,24 +1,26 @@
-using Flow.Launcher.Core.ExternalPlugins;
-using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.ViewModel;
-using Microsoft.Win32;
using ModernWpf;
+using ModernWpf.Controls;
using System;
+using System.Diagnostics;
using System.IO;
+using System.Security.Policy;
using System.Windows;
+using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Navigation;
using Button = System.Windows.Controls.Button;
using Control = System.Windows.Controls.Control;
+using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using MessageBox = System.Windows.MessageBox;
using TextBox = System.Windows.Controls.TextBox;
using ThemeManager = ModernWpf.ThemeManager;
@@ -27,23 +29,23 @@ namespace Flow.Launcher
{
public partial class SettingWindow
{
- private const string StartupPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
-
public readonly IPublicAPI API;
private Settings settings;
private SettingWindowViewModel viewModel;
- private static MainViewModel mainViewModel;
public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel)
{
- InitializeComponent();
settings = viewModel.Settings;
DataContext = viewModel;
this.viewModel = viewModel;
API = api;
+ InitializePosition();
+ InitializeComponent();
+
}
#region General
+
private void OnLoaded(object sender, RoutedEventArgs e)
{
RefreshMaximizeRestoreButton();
@@ -52,66 +54,33 @@ namespace Flow.Launcher
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly;
+
+ pluginListView = (CollectionView)CollectionViewSource.GetDefaultView(Plugins.ItemsSource);
+ pluginListView.Filter = PluginListFilter;
+
+ pluginStoreView = (CollectionView)CollectionViewSource.GetDefaultView(StoreListBox.ItemsSource);
+ pluginStoreView.Filter = PluginStoreFilter;
+
+ InitializePosition();
}
- private void OnAutoStartupChecked(object sender, RoutedEventArgs e)
+ private void OnSelectPythonPathClick(object sender, RoutedEventArgs e)
{
- SetStartup();
+ var selectedFile = viewModel.GetFileFromDialog(
+ InternationalizationManager.Instance.GetTranslation("selectPythonExecutable"),
+ "Python|pythonw.exe");
+
+ if (!string.IsNullOrEmpty(selectedFile))
+ settings.PluginSettings.PythonExecutablePath = selectedFile;
}
- private void OnAutoStartupUncheck(object sender, RoutedEventArgs e)
+ private void OnSelectNodePathClick(object sender, RoutedEventArgs e)
{
- RemoveStartup();
- }
+ var selectedFile = viewModel.GetFileFromDialog(
+ InternationalizationManager.Instance.GetTranslation("selectNodeExecutable"));
- public static void SetStartup()
- {
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- key?.SetValue(Constant.FlowLauncher, Constant.ExecutablePath);
- }
-
- private void RemoveStartup()
- {
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- key?.DeleteValue(Constant.FlowLauncher, false);
- }
-
- public static bool StartupSet()
- {
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- var path = key?.GetValue(Constant.FlowLauncher) as string;
- if (path != null)
- {
- return path == Constant.ExecutablePath;
- }
- return false;
- }
-
- private void OnSelectPythonDirectoryClick(object sender, RoutedEventArgs e)
- {
- var dlg = new FolderBrowserDialog
- {
- SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
- };
-
- var result = dlg.ShowDialog();
- if (result == System.Windows.Forms.DialogResult.OK)
- {
- string pythonDirectory = dlg.SelectedPath;
- if (!string.IsNullOrEmpty(pythonDirectory))
- {
- var pythonPath = Path.Combine(pythonDirectory, PluginsLoader.PythonExecutable);
- if (File.Exists(pythonPath))
- {
- settings.PluginSettings.PythonDirectory = pythonDirectory;
- MessageBox.Show("Remember to restart Flow Launcher use new Python path");
- }
- else
- {
- MessageBox.Show("Can't find python in given directory");
- }
- }
- }
+ if (!string.IsNullOrEmpty(selectedFile))
+ settings.PluginSettings.NodeExecutablePath = selectedFile;
}
private void OnSelectFileManagerClick(object sender, RoutedEventArgs e)
@@ -132,7 +101,7 @@ namespace Flow.Launcher
private void OnHotkeyControlLoaded(object sender, RoutedEventArgs e)
{
- HotkeyControl.SetHotkey(viewModel.Settings.Hotkey, false);
+ _ = HotkeyControl.SetHotkeyAsync(viewModel.Settings.Hotkey, false);
}
private void OnHotkeyControlFocused(object sender, RoutedEventArgs e)
@@ -154,6 +123,19 @@ namespace Flow.Launcher
}
}
+ private void OnPreviewHotkeyControlLoaded(object sender, RoutedEventArgs e)
+ {
+ _ = PreviewHotkeyControl.SetHotkeyAsync(settings.PreviewHotkey, false);
+ }
+
+ private void OnPreviewHotkeyControlFocusLost(object sender, RoutedEventArgs e)
+ {
+ if (PreviewHotkeyControl.CurrentHotkeyAvailable)
+ {
+ settings.PreviewHotkey = PreviewHotkeyControl.CurrentHotkey.ToString();
+ }
+ }
+
private void OnDeleteCustomHotkeyClick(object sender, RoutedEventArgs e)
{
var item = viewModel.SelectedCustomPluginHotkey;
@@ -175,7 +157,7 @@ namespace Flow.Launcher
}
}
- private void OnnEditCustomHotkeyClick(object sender, RoutedEventArgs e)
+ private void OnEditCustomHotkeyClick(object sender, RoutedEventArgs e)
{
var item = viewModel.SelectedCustomPluginHotkey;
if (item != null)
@@ -190,7 +172,7 @@ namespace Flow.Launcher
}
}
- private void OnAddCustomeHotkeyClick(object sender, RoutedEventArgs e)
+ private void OnAddCustomHotkeyClick(object sender, RoutedEventArgs e)
{
new CustomQueryHotkeySetting(this, settings).ShowDialog();
}
@@ -210,43 +192,11 @@ namespace Flow.Launcher
{
if (sender is Control { DataContext: PluginViewModel pluginViewModel })
{
- PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(pluginViewModel.PluginPair.Metadata.ID, settings, pluginViewModel);
+ PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(pluginViewModel.PluginPair.Metadata.ID, pluginViewModel);
priorityChangeWindow.ShowDialog();
}
}
- private void OnPluginActionKeywordsClick(object sender, RoutedEventArgs e)
- {
- var id = viewModel.SelectedPlugin.PluginPair.Metadata.ID;
- ActionKeywords changeKeywordsWindow = new ActionKeywords(id, settings, viewModel.SelectedPlugin);
- changeKeywordsWindow.ShowDialog();
- }
-
- private void OnPluginNameClick(object sender, MouseButtonEventArgs e)
- {
- if (e.ChangedButton == MouseButton.Left)
- {
- var website = viewModel.SelectedPlugin.PluginPair.Metadata.Website;
- if (!string.IsNullOrEmpty(website))
- {
- var uri = new Uri(website);
- if (Uri.CheckSchemeName(uri.Scheme))
- {
- website.OpenInBrowserTab();
- }
- }
- }
- }
-
- private void OnPluginDirecotyClick(object sender, MouseButtonEventArgs e)
- {
- if (e.ChangedButton == MouseButton.Left)
- {
- var directory = viewModel.SelectedPlugin.PluginPair.Metadata.PluginDirectory;
- if (!string.IsNullOrEmpty(directory))
- PluginManager.API.OpenDirectory(directory);
- }
- }
#endregion
#region Proxy
@@ -259,7 +209,7 @@ namespace Flow.Launcher
#endregion
- private async void OnCheckUpdates(object sender, RoutedEventArgs e)
+ private void OnCheckUpdates(object sender, RoutedEventArgs e)
{
viewModel.UpdateApp(); // TODO: change to command
}
@@ -272,6 +222,9 @@ namespace Flow.Launcher
private void OnClosed(object sender, EventArgs e)
{
+ settings.SettingWindowState = WindowState;
+ settings.SettingWindowTop = Top;
+ settings.SettingWindowLeft = Left;
viewModel.Save();
}
@@ -297,23 +250,66 @@ namespace Flow.Launcher
}
private void OpenLogFolder(object sender, RoutedEventArgs e)
{
- PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, Constant.Version));
+ viewModel.OpenLogFolder();
}
-
- private void OnPluginStoreRefreshClick(object sender, RoutedEventArgs e)
+ private void ClearLogFolder(object sender, RoutedEventArgs e)
{
- _ = viewModel.RefreshExternalPluginsAsync();
+ var confirmResult = MessageBox.Show(
+ InternationalizationManager.Instance.GetTranslation("clearlogfolderMessage"),
+ InternationalizationManager.Instance.GetTranslation("clearlogfolder"),
+ MessageBoxButton.YesNo);
+
+ if (confirmResult == MessageBoxResult.Yes)
+ {
+ viewModel.ClearLogFolder();
+ }
}
private void OnExternalPluginInstallClick(object sender, RoutedEventArgs e)
{
- if(sender is Button { DataContext: UserPlugin plugin })
+ if (sender is not Button { DataContext: PluginStoreItemViewModel plugin } button)
{
- var pluginsManagerPlugin = PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
- var actionKeyword = pluginsManagerPlugin.Metadata.ActionKeywords.Count == 0 ? "" : pluginsManagerPlugin.Metadata.ActionKeywords[0];
- API.ChangeQuery($"{actionKeyword} install {plugin.Name}");
- API.ShowMainWindow();
+ return;
}
+
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+
+ viewModel.DisplayPluginQuery($"install {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+ }
+
+ private void OnExternalPluginUninstallClick(object sender, MouseButtonEventArgs e)
+ {
+ if (e.ChangedButton == MouseButton.Left)
+ {
+ var name = viewModel.SelectedPlugin.PluginPair.Metadata.Name;
+ viewModel.DisplayPluginQuery($"uninstall {name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+ }
+ }
+
+ private void OnExternalPluginUninstallClick(object sender, RoutedEventArgs e)
+ {
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+
+ if (sender is Button { DataContext: PluginStoreItemViewModel plugin })
+ viewModel.DisplayPluginQuery($"uninstall {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+
+ }
+
+ private void OnExternalPluginUpdateClick(object sender, RoutedEventArgs e)
+ {
+ if (storeClickedButton != null)
+ {
+ FlyoutService.GetFlyout(storeClickedButton).Hide();
+ }
+ if (sender is Button { DataContext: PluginStoreItemViewModel plugin })
+ viewModel.DisplayPluginQuery($"update {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"));
+
}
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
@@ -326,7 +322,7 @@ namespace Flow.Launcher
textBox.MoveFocus(tRequest);
}
- private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e)
+ private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e)
=> ThemeManager.Current.ApplicationTheme = settings.ColorScheme switch
{
Constant.Light => ApplicationTheme.Light,
@@ -349,6 +345,7 @@ namespace Flow.Launcher
private void OnCloseButtonClick(object sender, RoutedEventArgs e)
{
+
Close();
}
@@ -365,10 +362,165 @@ namespace Flow.Launcher
restoreButton.Visibility = Visibility.Collapsed;
}
}
+
private void Window_StateChanged(object sender, EventArgs e)
{
RefreshMaximizeRestoreButton();
}
+ #region Shortcut
+
+ private void OnDeleteCustomShortCutClick(object sender, RoutedEventArgs e)
+ {
+ viewModel.DeleteSelectedCustomShortcut();
+ }
+
+ private void OnEditCustomShortCutClick(object sender, RoutedEventArgs e)
+ {
+ if (viewModel.EditSelectedCustomShortcut())
+ {
+ customShortcutView.Items.Refresh();
+ }
+ }
+
+ private void OnAddCustomShortCutClick(object sender, RoutedEventArgs e)
+ {
+ viewModel.AddCustomShortcut();
+ }
+
+ #endregion
+
+ private CollectionView pluginListView;
+ private CollectionView pluginStoreView;
+
+ private bool PluginListFilter(object item)
+ {
+ if (string.IsNullOrEmpty(pluginFilterTxb.Text))
+ return true;
+ if (item is PluginViewModel model)
+ {
+ return StringMatcher.FuzzySearch(pluginFilterTxb.Text, model.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet();
+ }
+ return false;
+ }
+
+ private bool PluginStoreFilter(object item)
+ {
+ if (string.IsNullOrEmpty(pluginStoreFilterTxb.Text))
+ return true;
+ if (item is PluginStoreItemViewModel model)
+ {
+ return StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Name).IsSearchPrecisionScoreMet()
+ || StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Description).IsSearchPrecisionScoreMet();
+ }
+ return false;
+ }
+
+ private string lastPluginListSearch = "";
+ private string lastPluginStoreSearch = "";
+
+ private void RefreshPluginListEventHandler(object sender, RoutedEventArgs e)
+ {
+ if (pluginFilterTxb.Text != lastPluginListSearch)
+ {
+ lastPluginListSearch = pluginFilterTxb.Text;
+ pluginListView.Refresh();
+ }
+ }
+
+ private void RefreshPluginStoreEventHandler(object sender, RoutedEventArgs e)
+ {
+ if (pluginStoreFilterTxb.Text != lastPluginStoreSearch)
+ {
+ lastPluginStoreSearch = pluginStoreFilterTxb.Text;
+ pluginStoreView.Refresh();
+ }
+ }
+
+ private void PluginFilterTxb_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Enter)
+ RefreshPluginListEventHandler(sender, e);
+ }
+
+ private void PluginStoreFilterTxb_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Enter)
+ RefreshPluginStoreEventHandler(sender, e);
+ }
+
+ private void OnPluginSettingKeydown(object sender, KeyEventArgs e)
+ {
+ if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.F)
+ pluginFilterTxb.Focus();
+ }
+
+ private void PluginStore_OnKeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.F && (Keyboard.Modifiers & ModifierKeys.Control) != 0)
+ {
+ pluginStoreFilterTxb.Focus();
+ }
+ }
+
+ public void InitializePosition()
+ {
+ if (settings.SettingWindowTop >= 0 && settings.SettingWindowLeft >= 0)
+ {
+ Top = settings.SettingWindowTop;
+ Left = settings.SettingWindowLeft;
+ }
+ else
+ {
+ Top = WindowTop();
+ Left = WindowLeft();
+ }
+ WindowState = settings.SettingWindowState;
+ }
+
+ public double WindowLeft()
+ {
+ var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
+ var left = (dip2.X - this.ActualWidth) / 2 + dip1.X;
+ return left;
+ }
+
+ public double WindowTop()
+ {
+ var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
+ var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
+ var top = (dip2.Y - this.ActualHeight) / 2 + dip1.Y - 20;
+ return top;
+ }
+
+ private Button storeClickedButton;
+
+ private void StoreListItem_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender is not Button button)
+ return;
+
+ storeClickedButton = button;
+
+ var flyout = FlyoutService.GetFlyout(button);
+ flyout.Closed += (_, _) =>
+ {
+ storeClickedButton = null;
+ };
+
+ }
+
+ private void PluginStore_GotFocus(object sender, RoutedEventArgs e)
+ {
+ Keyboard.Focus(pluginStoreFilterTxb);
+ }
+
+ private void Plugin_GotFocus(object sender, RoutedEventArgs e)
+ {
+ Keyboard.Focus(pluginFilterTxb);
+ }
}
}
diff --git a/Flow.Launcher/Themes/Atom.xaml b/Flow.Launcher/Themes/Atom.xaml
deleted file mode 100644
index 10daf817f..000000000
--- a/Flow.Launcher/Themes/Atom.xaml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #2c313c
-
-
-
-
-
-
-
-
-
-
diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml
index 454904f3a..2ba3a5929 100644
--- a/Flow.Launcher/Themes/Base.xaml
+++ b/Flow.Launcher/Themes/Base.xaml
@@ -1,32 +1,62 @@
-
+
+ 0
+ 0
+ 0
+
+
+ 52
+
+
+
+
+
-
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
+
@@ -150,9 +280,14 @@
+
+
+
+
+
-
+
@@ -160,44 +295,50 @@
-
-
+
+
-
-
+
+
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/BlackAndWhite.xaml b/Flow.Launcher/Themes/BlackAndWhite.xaml
deleted file mode 100644
index 395f5d614..000000000
--- a/Flow.Launcher/Themes/BlackAndWhite.xaml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #494949
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/BlurBlack Darker.xaml b/Flow.Launcher/Themes/BlurBlack Darker.xaml
index 98ab77314..67a47f4cf 100644
--- a/Flow.Launcher/Themes/BlurBlack Darker.xaml
+++ b/Flow.Launcher/Themes/BlurBlack Darker.xaml
@@ -1,79 +1,138 @@
-
+
True
-
+
-
-
-
-
+
+
-
-
-
-
-
-
- #356ef3
+ #19ffffff
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/BlurBlack.xaml b/Flow.Launcher/Themes/BlurBlack.xaml
index 2fdbd0cd3..0f1264292 100644
--- a/Flow.Launcher/Themes/BlurBlack.xaml
+++ b/Flow.Launcher/Themes/BlurBlack.xaml
@@ -1,75 +1,134 @@
-
+
True
-
+
-
-
-
-
+
+
-
-
-
-
-
-
- #356ef3
+ #19c9c9c9
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/BlurWhite.xaml b/Flow.Launcher/Themes/BlurWhite.xaml
index 99b5b222c..4406724b8 100644
--- a/Flow.Launcher/Themes/BlurWhite.xaml
+++ b/Flow.Launcher/Themes/BlurWhite.xaml
@@ -1,71 +1,131 @@
-
+
True
-
-
+
-
+
-
+
+
-
+
-
+
+
+
+
-
-
-
-
-
- #356ef3
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Bullet Light.xaml b/Flow.Launcher/Themes/Bullet Light.xaml
new file mode 100644
index 000000000..1f776a2ee
--- /dev/null
+++ b/Flow.Launcher/Themes/Bullet Light.xaml
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #f1f1f1
+
+
+
+
+
+
+
+
+
+
+ 5
+ 10 0 10 0
+ 0 0 0 10
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Circle Light.xaml b/Flow.Launcher/Themes/Circle Light.xaml
new file mode 100644
index 000000000..e52e3a957
--- /dev/null
+++ b/Flow.Launcher/Themes/Circle Light.xaml
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #5046e5
+
+
+
+
+
+
+
+
+
+
+ 8
+ 10 0 10 0
+ 0 0 0 10
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Circle System.xaml b/Flow.Launcher/Themes/Circle System.xaml
new file mode 100644
index 000000000..2b2ce7ca3
--- /dev/null
+++ b/Flow.Launcher/Themes/Circle System.xaml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 8
+ 10 0 10 0
+ 0 0 0 10
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Cyan Dark.xaml b/Flow.Launcher/Themes/Cyan Dark.xaml
new file mode 100644
index 000000000..60bc09002
--- /dev/null
+++ b/Flow.Launcher/Themes/Cyan Dark.xaml
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #1e292f
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0 0 0 4
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Darker Glass.xaml b/Flow.Launcher/Themes/Darker Glass.xaml
index de37dd192..89b6dfa01 100644
--- a/Flow.Launcher/Themes/Darker Glass.xaml
+++ b/Flow.Launcher/Themes/Darker Glass.xaml
@@ -1,95 +1,174 @@
-
+
-
-
-
-
-
-
-
+
-
-
-
-
-
#545454
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Darker.xaml b/Flow.Launcher/Themes/Darker.xaml
index 675092bf8..d1abbe978 100644
--- a/Flow.Launcher/Themes/Darker.xaml
+++ b/Flow.Launcher/Themes/Darker.xaml
@@ -1,51 +1,100 @@
-
+
-
-
-
-
+
-
+
-
+
-
-
-
-
-
#4d4d4d
-
-
-
+
+
-
+
diff --git a/Flow.Launcher/Themes/Discord Dark.xaml b/Flow.Launcher/Themes/Discord Dark.xaml
index 636fe7b6d..5315c7644 100644
--- a/Flow.Launcher/Themes/Discord Dark.xaml
+++ b/Flow.Launcher/Themes/Discord Dark.xaml
@@ -1,64 +1,101 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
#49443c
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Dracula.xaml b/Flow.Launcher/Themes/Dracula.xaml
index c661d33e3..d150e7355 100644
--- a/Flow.Launcher/Themes/Dracula.xaml
+++ b/Flow.Launcher/Themes/Dracula.xaml
@@ -1,64 +1,100 @@
-
+
-
-
-
-
-
-
+
-
-
-
-
-
-
#44475a
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Gray.xaml b/Flow.Launcher/Themes/Gray.xaml
index c3cec7bd8..d8d344e21 100644
--- a/Flow.Launcher/Themes/Gray.xaml
+++ b/Flow.Launcher/Themes/Gray.xaml
@@ -1,71 +1,195 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
- #787878
-
+ #797d86
+
+
+
-
-
-
+
+
+
+
+
+ 0
+ 0
+ 0 0 0 0
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/League.xaml b/Flow.Launcher/Themes/League.xaml
index 06649978b..7fbe56187 100644
--- a/Flow.Launcher/Themes/League.xaml
+++ b/Flow.Launcher/Themes/League.xaml
@@ -1,61 +1,112 @@
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
+
+
#192026
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Light.xaml b/Flow.Launcher/Themes/Light.xaml
deleted file mode 100644
index 10c995941..000000000
--- a/Flow.Launcher/Themes/Light.xaml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #d9d9d9
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Metro Server.xaml b/Flow.Launcher/Themes/Metro Server.xaml
deleted file mode 100644
index 016e6af9d..000000000
--- a/Flow.Launcher/Themes/Metro Server.xaml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #04152E
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Midnight.xaml b/Flow.Launcher/Themes/Midnight.xaml
new file mode 100644
index 000000000..91ff620d5
--- /dev/null
+++ b/Flow.Launcher/Themes/Midnight.xaml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #202938
+
+
+
+
+
+
+
+
+
+
+ 8
+ 10 0 10 0
+ 0 0 0 10
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Nord Darker.xaml b/Flow.Launcher/Themes/Nord Darker.xaml
index 413effa51..d9ddb3076 100644
--- a/Flow.Launcher/Themes/Nord Darker.xaml
+++ b/Flow.Launcher/Themes/Nord Darker.xaml
@@ -1,64 +1,118 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
#4e586b
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Nord.xaml b/Flow.Launcher/Themes/Nord.xaml
deleted file mode 100644
index 2fcc11ef2..000000000
--- a/Flow.Launcher/Themes/Nord.xaml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #596479
-
-
-
-
-
-
diff --git a/Flow.Launcher/Themes/Pink.xaml b/Flow.Launcher/Themes/Pink.xaml
index cb5f56a8e..dc97e4320 100644
--- a/Flow.Launcher/Themes/Pink.xaml
+++ b/Flow.Launcher/Themes/Pink.xaml
@@ -1,63 +1,110 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
#cc1081
-
-
+
F1 M20,20z M0,0z M14.75,1A5.24,5.24,0,0,0,10,4A5.24,5.24,0,0,0,0,6.25C0,11.75 10,19 10,19 10,19 20,11.75 20,6.25A5.25,5.25,0,0,0,14.75,1z
@@ -74,4 +121,41 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/SlimLight.xaml b/Flow.Launcher/Themes/SlimLight.xaml
new file mode 100644
index 000000000..dc08eec30
--- /dev/null
+++ b/Flow.Launcher/Themes/SlimLight.xaml
@@ -0,0 +1,217 @@
+
+
+
+
+
+ 38
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #d6d4d7
+
+
+
+
+
+
+
+
+
+
+
+ 6
+ 4 0 4 0
+ 0 0 0 4
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Sublime.xaml b/Flow.Launcher/Themes/Sublime.xaml
index 82fff06ff..6df69ad3e 100644
--- a/Flow.Launcher/Themes/Sublime.xaml
+++ b/Flow.Launcher/Themes/Sublime.xaml
@@ -1,64 +1,101 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
#3c454e
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Ubuntu.xaml b/Flow.Launcher/Themes/Ubuntu.xaml
new file mode 100644
index 000000000..33f232699
--- /dev/null
+++ b/Flow.Launcher/Themes/Ubuntu.xaml
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #4d4d4d
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0 0 0 0
+ 0 0 0 8
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/Themes/Win10Light.xaml b/Flow.Launcher/Themes/Win10Light.xaml
index 6f487a895..eaa66e7fd 100644
--- a/Flow.Launcher/Themes/Win10Light.xaml
+++ b/Flow.Launcher/Themes/Win10Light.xaml
@@ -1,67 +1,109 @@
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
#ccd0d4
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Win11Dark.xaml b/Flow.Launcher/Themes/Win11Dark.xaml
index 31f6fb956..5abb96cce 100644
--- a/Flow.Launcher/Themes/Win11Dark.xaml
+++ b/Flow.Launcher/Themes/Win11Dark.xaml
@@ -5,6 +5,7 @@
+ 0 0 0 8
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Win11Light.xaml b/Flow.Launcher/Themes/Win11Light.xaml
index 33aa6cdee..e6f376f8b 100644
--- a/Flow.Launcher/Themes/Win11Light.xaml
+++ b/Flow.Launcher/Themes/Win11Light.xaml
@@ -1,64 +1,114 @@
-
+
-
-
+
-
-
-
-
+
-
-
-
-
-
-
#198F8F8F
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Flow.Launcher/Themes/Win11System.xaml b/Flow.Launcher/Themes/Win11System.xaml
index bcc83be9f..3025f9a07 100644
--- a/Flow.Launcher/Themes/Win11System.xaml
+++ b/Flow.Launcher/Themes/Win11System.xaml
@@ -6,19 +6,25 @@
+ 0 0 0 8
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 8a3b99801..597203096 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1,10 +1,9 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Input;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
@@ -17,19 +16,22 @@ using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Storage;
using Flow.Launcher.Infrastructure.Logger;
using Microsoft.VisualStudio.Threading;
+using System.Text;
using System.Threading.Channels;
using ISavable = Flow.Launcher.Plugin.ISavable;
using System.IO;
using System.Collections.Specialized;
+using CommunityToolkit.Mvvm.Input;
+using System.Globalization;
+using System.Windows.Input;
+using System.ComponentModel;
namespace Flow.Launcher.ViewModel
{
- public class MainViewModel : BaseModel, ISavable
+ public partial class MainViewModel : BaseModel, ISavable
{
#region Private Fields
- private const string DefaultOpenResultModifiers = "Alt";
-
private bool _isQueryRunning;
private Query _lastQuery;
private string _queryTextBeforeLeaveResults;
@@ -37,7 +39,6 @@ namespace Flow.Launcher.ViewModel
private readonly FlowLauncherJsonStorage _historyItemsStorage;
private readonly FlowLauncherJsonStorage _userSelectedRecordStorage;
private readonly FlowLauncherJsonStorage _topMostRecordStorage;
- internal readonly Settings _settings;
private readonly History _history;
private readonly UserSelectedRecord _userSelectedRecord;
private readonly TopMostRecord _topMostRecord;
@@ -60,12 +61,23 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
- _settings = settings;
- _settings.PropertyChanged += (_, args) =>
+ Settings = settings;
+ Settings.PropertyChanged += (_, args) =>
{
- if (args.PropertyName == nameof(Settings.WindowSize))
+ switch (args.PropertyName)
{
- OnPropertyChanged(nameof(MainWindowWidth));
+ case nameof(Settings.WindowSize):
+ OnPropertyChanged(nameof(MainWindowWidth));
+ break;
+ case nameof(Settings.AlwaysStartEn):
+ OnPropertyChanged(nameof(StartWithEnglishMode));
+ break;
+ case nameof(Settings.OpenResultModifiers):
+ OnPropertyChanged(nameof(OpenResultCommandModifiers));
+ break;
+ case nameof(Settings.PreviewHotkey):
+ OnPropertyChanged(nameof(PreviewHotkey));
+ break;
}
};
@@ -76,16 +88,34 @@ namespace Flow.Launcher.ViewModel
_userSelectedRecord = _userSelectedRecordStorage.Load();
_topMostRecord = _topMostRecordStorage.Load();
- ContextMenu = new ResultsViewModel(_settings);
- Results = new ResultsViewModel(_settings);
- History = new ResultsViewModel(_settings);
+
+ ContextMenu = new ResultsViewModel(Settings)
+ {
+ LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand
+ };
+ Results = new ResultsViewModel(Settings)
+ {
+ LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand
+ };
+ History = new ResultsViewModel(Settings)
+ {
+ LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand
+ };
_selectedResults = Results;
- InitializeKeyCommands();
+ Results.PropertyChanged += (_, args) =>
+ {
+ switch (args.PropertyName)
+ {
+ case nameof(Results.SelectedItem):
+ UpdatePreview();
+ break;
+ }
+ };
+
RegisterViewUpdate();
RegisterResultsUpdatedEvent();
-
- SetOpenResultModifiers();
+ _ = RegisterClockAndDateUpdateAsync();
}
private void RegisterViewUpdate()
@@ -117,8 +147,6 @@ namespace Flow.Launcher.ViewModel
Log.Error("MainViewModel", "Unexpected ResultViewUpdate ends");
}
- ;
-
void continueAction(Task t)
{
#if DEBUG
@@ -154,175 +182,211 @@ namespace Flow.Launcher.ViewModel
}
}
- private void InitializeKeyCommands()
+ [RelayCommand]
+ private async Task ReloadPluginDataAsync()
{
- EscCommand = new RelayCommand(_ =>
+ Hide();
+
+ await PluginManager.ReloadDataAsync().ConfigureAwait(false);
+ Notification.Show(InternationalizationManager.Instance.GetTranslation("success"), InternationalizationManager.Instance.GetTranslation("completedSuccessfully"));
+ }
+
+ [RelayCommand]
+ private void LoadHistory()
+ {
+ if (SelectedIsFromQueryResults())
{
- if (!SelectedIsFromQueryResults())
- {
- SelectedResults = Results;
- }
- else
- {
- Hide();
- }
- });
-
- ClearQueryCommand = new RelayCommand(_ =>
+ SelectedResults = History;
+ History.SelectedIndex = _history.Items.Count - 1;
+ }
+ else
{
- if (!string.IsNullOrEmpty(QueryText))
- {
- ChangeQueryText(string.Empty);
+ SelectedResults = Results;
+ }
+ }
- // Push Event to UI SystemQuery has changed
- //OnPropertyChanged(nameof(SystemQueryText));
- }
- });
-
- SelectNextItemCommand = new RelayCommand(_ => { SelectedResults.SelectNextResult(); });
-
- SelectPrevItemCommand = new RelayCommand(_ => { SelectedResults.SelectPrevResult(); });
-
- SelectNextPageCommand = new RelayCommand(_ => { SelectedResults.SelectNextPage(); });
-
- SelectPrevPageCommand = new RelayCommand(_ => { SelectedResults.SelectPrevPage(); });
-
- SelectFirstResultCommand = new RelayCommand(_ => SelectedResults.SelectFirstResult());
-
- StartHelpCommand = new RelayCommand(_ =>
+ [RelayCommand]
+ private void LoadContextMenu()
+ {
+ if (SelectedIsFromQueryResults())
{
- PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/");
- });
- OpenSettingCommand = new RelayCommand(_ => { App.API.OpenSettingDialog(); });
- OpenResultCommand = new RelayCommand(index =>
+ // When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
+ // i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
+ if (SelectedResults.SelectedItem != null)
+ SelectedResults = ContextMenu;
+ }
+ else
{
- var results = SelectedResults;
+ SelectedResults = Results;
+ }
+ }
- if (index != null)
- {
- results.SelectedIndex = int.Parse(index.ToString());
- }
+ [RelayCommand]
+ private void Backspace(object index)
+ {
+ var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
- var result = results.SelectedItem?.Result;
- if (result != null) // SelectedItem returns null if selection is empty.
- {
- bool hideWindow = result.Action != null && result.Action(new ActionContext
- {
- SpecialKeyState = GlobalHotkey.CheckModifiers()
- });
+ // GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string
+ var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\'));
- if (SelectedIsFromQueryResults())
- {
- _userSelectedRecord.Add(result);
- _history.Add(result.OriginQuery.RawQuery);
- }
- else
- {
- SelectedResults = Results;
- }
-
- if (hideWindow)
- {
- Hide();
- }
- }
- });
+ var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} ";
- AutocompleteQueryCommand = new RelayCommand(_ =>
+ ChangeQueryText($"{actionKeyword}{path}");
+ }
+
+ [RelayCommand]
+ private void AutocompleteQuery()
+ {
+ var result = SelectedResults.SelectedItem?.Result;
+ if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty.
{
- var result = SelectedResults.SelectedItem?.Result;
- if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty.
+ var autoCompleteText = result.Title;
+
+ if (!string.IsNullOrEmpty(result.AutoCompleteText))
{
- var autoCompleteText = result.Title;
-
- if (!string.IsNullOrEmpty(result.AutoCompleteText))
- {
- autoCompleteText = result.AutoCompleteText;
- }
- else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText))
- {
- autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText;
- }
-
- var specialKeyState = GlobalHotkey.CheckModifiers();
- if (specialKeyState.ShiftPressed)
- {
- autoCompleteText = result.SubTitle;
- }
-
- ChangeQueryText(autoCompleteText);
+ autoCompleteText = result.AutoCompleteText;
+ }
+ else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText))
+ {
+ autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText;
}
- });
- BackspaceCommand = new RelayCommand(index =>
+ var specialKeyState = GlobalHotkey.CheckModifiers();
+ if (specialKeyState.ShiftPressed)
+ {
+ autoCompleteText = result.SubTitle;
+ }
+
+ ChangeQueryText(autoCompleteText);
+ }
+ }
+
+ [RelayCommand]
+ private async Task OpenResultAsync(string index)
+ {
+ var results = SelectedResults;
+ if (index is not null)
{
- var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
-
- // GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string
- var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\'));
-
- var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} ";
-
- ChangeQueryText($"{actionKeyword}{path}");
- });
-
- LoadContextMenuCommand = new RelayCommand(_ =>
+ results.SelectedIndex = int.Parse(index);
+ }
+ var result = results.SelectedItem?.Result;
+ if (result == null)
{
- if (SelectedIsFromQueryResults())
+ return;
+ }
+ var hideWindow = await result.ExecuteAsync(new ActionContext
{
- // When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
- // i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
- if (SelectedResults.SelectedItem != null)
- SelectedResults = ContextMenu;
- }
- else
- {
- SelectedResults = Results;
- }
- });
+ SpecialKeyState = GlobalHotkey.CheckModifiers()
+ })
+ .ConfigureAwait(false);
- LoadHistoryCommand = new RelayCommand(_ =>
+
+ if (SelectedIsFromQueryResults())
{
- if (SelectedIsFromQueryResults())
- {
- SelectedResults = History;
- History.SelectedIndex = _history.Items.Count - 1;
- }
- else
- {
- SelectedResults = Results;
- }
- });
-
- ReloadPluginDataCommand = new RelayCommand(_ =>
+ _userSelectedRecord.Add(result);
+ _history.Add(result.OriginQuery.RawQuery);
+ }
+ else
+ {
+ SelectedResults = Results;
+ }
+
+ if (hideWindow)
{
Hide();
+ }
+ }
- PluginManager
- .ReloadData()
- .ContinueWith(_ =>
- Application.Current.Dispatcher.Invoke(() =>
- {
- Notification.Show(
- InternationalizationManager.Instance.GetTranslation("success"),
- InternationalizationManager.Instance.GetTranslation("completedSuccessfully"),
- "");
- }))
- .ConfigureAwait(false);
- });
+ [RelayCommand]
+ private void OpenSetting()
+ {
+ App.API.OpenSettingDialog();
+ }
+
+ [RelayCommand]
+ private void SelectHelp()
+ {
+ PluginManager.API.OpenUrl("https://www.flowlauncher.com/docs/#/usage-tips");
+ }
+
+ [RelayCommand]
+ private void SelectFirstResult()
+ {
+ SelectedResults.SelectFirstResult();
+ }
+
+ [RelayCommand]
+ private void SelectPrevPage()
+ {
+ SelectedResults.SelectPrevPage();
+ }
+
+ [RelayCommand]
+ private void SelectNextPage()
+ {
+ SelectedResults.SelectNextPage();
+ }
+
+ [RelayCommand]
+ private void SelectPrevItem()
+ {
+ SelectedResults.SelectPrevResult();
+ }
+
+ [RelayCommand]
+ private void SelectNextItem()
+ {
+ SelectedResults.SelectNextResult();
+ }
+
+ [RelayCommand]
+ private void Esc()
+ {
+ if (!SelectedIsFromQueryResults())
+ {
+ SelectedResults = Results;
+ }
+ else
+ {
+ Hide();
+ }
+ }
+
+ [RelayCommand]
+ public void ToggleGameMode()
+ {
+ GameModeStatus = !GameModeStatus;
}
#endregion
#region ViewModel Properties
+ public Settings Settings { get; }
+ public string ClockText { get; private set; }
+ public string DateText { get; private set; }
+ public CultureInfo Culture => CultureInfo.DefaultThreadCurrentCulture;
+
+ private async Task RegisterClockAndDateUpdateAsync()
+ {
+ var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
+ // ReSharper disable once MethodSupportsCancellation
+ while (await timer.WaitForNextTickAsync().ConfigureAwait(false))
+ {
+ if (Settings.UseClock)
+ ClockText = DateTime.Now.ToString(Settings.TimeFormat, Culture);
+ if (Settings.UseDate)
+ DateText = DateTime.Now.ToString(Settings.DateFormat, Culture);
+ }
+ }
+
public ResultsViewModel Results { get; private set; }
-
+
public ResultsViewModel ContextMenu { get; private set; }
-
+
public ResultsViewModel History { get; private set; }
- public bool GameModeStatus { get; set; }
+ public bool GameModeStatus { get; set; } = false;
private string _queryText;
public string QueryText
@@ -331,27 +395,131 @@ namespace Flow.Launcher.ViewModel
set
{
_queryText = value;
+ OnPropertyChanged();
Query();
}
}
+ [RelayCommand]
+ private void IncreaseWidth()
+ {
+ if (MainWindowWidth + 100 > 1920 || Settings.WindowSize == 1920)
+ {
+ Settings.WindowSize = 1920;
+ }
+ else
+ {
+ Settings.WindowSize += 100;
+ Settings.WindowLeft -= 50;
+ }
+ OnPropertyChanged();
+ }
+
+ [RelayCommand]
+ private void DecreaseWidth()
+ {
+ if (MainWindowWidth - 100 < 400 || Settings.WindowSize == 400)
+ {
+ Settings.WindowSize = 400;
+ }
+ else
+ {
+ Settings.WindowLeft += 50;
+ Settings.WindowSize -= 100;
+ }
+ OnPropertyChanged();
+ }
+
+ [RelayCommand]
+ private void IncreaseMaxResult()
+ {
+ if (Settings.MaxResultsToShow == 17)
+ return;
+
+ Settings.MaxResultsToShow += 1;
+ }
+
+ [RelayCommand]
+ private void DecreaseMaxResult()
+ {
+ if (Settings.MaxResultsToShow == 2)
+ return;
+
+ Settings.MaxResultsToShow -= 1;
+ }
+
+ [RelayCommand]
+ public void TogglePreview()
+ {
+ if (!PreviewVisible)
+ {
+ ShowPreview();
+ }
+ else
+ {
+ HidePreview();
+ }
+ }
+
+ private void ShowPreview()
+ {
+ ResultAreaColumn = 1;
+ PreviewVisible = true;
+ Results.SelectedItem?.LoadPreviewImage();
+ }
+
+ private void HidePreview()
+ {
+ ResultAreaColumn = 3;
+ PreviewVisible = false;
+ }
+
+ public void ResetPreview()
+ {
+ if (Settings.AlwaysPreview == true)
+ {
+ ShowPreview();
+ }
+ else
+ {
+ HidePreview();
+ }
+ }
+
+ private void UpdatePreview()
+ {
+ if (PreviewVisible)
+ {
+ Results.SelectedItem?.LoadPreviewImage();
+ }
+ }
+
///
/// we need move cursor to end when we manually changed query
/// but we don't want to move cursor to end when query is updated from TextBox
///
///
+ /// Force query even when Query Text doesn't change
public void ChangeQueryText(string queryText, bool reQuery = false)
{
- if (QueryText != queryText)
+ Application.Current.Dispatcher.Invoke(() =>
{
- // re-query is done in QueryText's setter method
- QueryText = queryText;
- }
- else if (reQuery)
- {
- Query();
- }
- QueryTextCursorMovedToEnd = true;
+ if (QueryText != queryText)
+ {
+
+ // re-query is done in QueryText's setter method
+ QueryText = queryText;
+ // set to false so the subsequent set true triggers
+ // PropertyChanged and MoveQueryTextToEnd is called
+ QueryTextCursorMovedToEnd = false;
+
+ }
+ else if (reQuery)
+ {
+ Query();
+ }
+ QueryTextCursorMovedToEnd = true;
+ });
}
public bool LastQuerySelected { get; set; }
@@ -369,13 +537,13 @@ namespace Flow.Launcher.ViewModel
_selectedResults = value;
if (SelectedIsFromQueryResults())
{
- ContextMenu.Visbility = Visibility.Collapsed;
- History.Visbility = Visibility.Collapsed;
+ ContextMenu.Visibility = Visibility.Collapsed;
+ History.Visibility = Visibility.Collapsed;
ChangeQueryText(_queryTextBeforeLeaveResults);
}
else
{
- Results.Visbility = Visibility.Collapsed;
+ Results.Visibility = Visibility.Collapsed;
_queryTextBeforeLeaveResults = QueryText;
@@ -393,7 +561,7 @@ namespace Flow.Launcher.ViewModel
}
}
- _selectedResults.Visbility = Visibility.Visible;
+ _selectedResults.Visibility = Visibility.Visible;
}
}
@@ -407,35 +575,47 @@ namespace Flow.Launcher.ViewModel
public Visibility SearchIconVisibility { get; set; }
- public double MainWindowWidth => _settings.WindowSize;
+ public double MainWindowWidth
+ {
+ get => Settings.WindowSize;
+ set => Settings.WindowSize = value;
+ }
public string PluginIconPath { get; set; } = null;
- public ICommand EscCommand { get; set; }
- public ICommand BackspaceCommand { get; set; }
- public ICommand SelectNextItemCommand { get; set; }
- public ICommand SelectPrevItemCommand { get; set; }
- public ICommand SelectNextPageCommand { get; set; }
- public ICommand SelectPrevPageCommand { get; set; }
- public ICommand SelectFirstResultCommand { get; set; }
- public ICommand StartHelpCommand { get; set; }
- public ICommand LoadContextMenuCommand { get; set; }
- public ICommand LoadHistoryCommand { get; set; }
- public ICommand OpenResultCommand { get; set; }
- public ICommand OpenSettingCommand { get; set; }
- public ICommand ReloadPluginDataCommand { get; set; }
- public ICommand ClearQueryCommand { get; private set; }
+ public string OpenResultCommandModifiers => Settings.OpenResultModifiers;
- public ICommand CopyToClipboard { get; set; }
-
- public ICommand AutocompleteQueryCommand { get; set; }
-
- public string OpenResultCommandModifiers { get; private set; }
+ public string PreviewHotkey
+ {
+ get
+ {
+ // TODO try to patch issue #1755
+ // Added in v1.14.0, remove after v1.16.0.
+ try
+ {
+ var converter = new KeyGestureConverter();
+ var key = (KeyGesture)converter.ConvertFromString(Settings.PreviewHotkey);
+ }
+ catch (Exception e) when (e is NotSupportedException || e is InvalidEnumArgumentException)
+ {
+ Settings.PreviewHotkey = "F1";
+ }
+ return Settings.PreviewHotkey;
+ }
+ }
public string Image => Constant.QueryTextBoxIconImagePath;
+ public bool StartWithEnglishMode => Settings.AlwaysStartEn;
+
+ public bool PreviewVisible { get; set; } = false;
+
+ public int ResultAreaColumn { get; set; } = 1;
+
#endregion
+ #region Query
+
public void Query()
{
if (SelectedIsFromQueryResults())
@@ -544,10 +724,12 @@ namespace Flow.Launcher.ViewModel
{
_updateSource?.Cancel();
- if (string.IsNullOrWhiteSpace(QueryText))
+ var query = ConstructQuery(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
+
+ if (query == null) // shortcut expanded
{
Results.Clear();
- Results.Visbility = Visibility.Collapsed;
+ Results.Visibility = Visibility.Collapsed;
PluginIconPath = null;
SearchIconVisibility = Visibility.Visible;
return;
@@ -569,7 +751,6 @@ namespace Flow.Launcher.ViewModel
if (currentCancellationToken.IsCancellationRequested)
return;
- var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
// handle the exclusiveness of plugin using action keyword
RemoveOldQueryResults(query);
@@ -588,7 +769,7 @@ namespace Flow.Launcher.ViewModel
PluginIconPath = null;
SearchIconVisibility = Visibility.Visible;
}
-
+
if (query.ActionKeyword == Plugin.Query.GlobalPluginWildcardSign)
{
@@ -659,9 +840,59 @@ namespace Flow.Launcher.ViewModel
}
}
+ private Query ConstructQuery(string queryText, IEnumerable customShortcuts, IEnumerable builtInShortcuts)
+ {
+ if (string.IsNullOrWhiteSpace(queryText))
+ {
+ return null;
+ }
+
+ StringBuilder queryBuilder = new(queryText);
+ StringBuilder queryBuilderTmp = new(queryText);
+
+ foreach (var shortcut in customShortcuts)
+ {
+ if (queryBuilder.Equals(shortcut.Key))
+ {
+ queryBuilder.Replace(shortcut.Key, shortcut.Expand());
+ }
+
+ queryBuilder.Replace('@' + shortcut.Key, shortcut.Expand());
+ }
+
+ string customExpanded = queryBuilder.ToString();
+
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ foreach (var shortcut in builtInShortcuts)
+ {
+ try
+ {
+ if (customExpanded.Contains(shortcut.Key))
+ {
+ var expansion = shortcut.Expand();
+ queryBuilder.Replace(shortcut.Key, expansion);
+ queryBuilderTmp.Replace(shortcut.Key, expansion);
+ }
+ }
+ catch (Exception e)
+ {
+ Log.Exception($"{nameof(MainViewModel)}.{nameof(ConstructQuery)}|Error when expanding shortcut {shortcut.Key}", e);
+ }
+ }
+ });
+
+ // show expanded builtin shortcuts
+ // use private field to avoid infinite recursion
+ _queryText = queryBuilderTmp.ToString();
+
+ var query = QueryBuilder.Build(queryBuilder.ToString().Trim(), PluginManager.NonGlobalPlugins);
+ return query;
+ }
+
private void RemoveOldQueryResults(Query query)
{
- if (_lastQuery.ActionKeyword != query.ActionKeyword)
+ if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
{
Results.Clear();
}
@@ -696,7 +927,7 @@ namespace Flow.Launcher.ViewModel
Action = _ =>
{
_topMostRecord.AddOrUpdate(result);
- App.API.ShowMsg("Success");
+ App.API.ShowMsg(InternationalizationManager.Instance.GetTranslation("success"));
return false;
}
};
@@ -751,12 +982,9 @@ namespace Flow.Launcher.ViewModel
return selected;
}
- #region Hotkey
+ #endregion
- private void SetOpenResultModifiers()
- {
- OpenResultCommandModifiers = _settings.OpenResultModifiers ?? DefaultOpenResultModifiers;
- }
+ #region Hotkey
public void ToggleFlowLauncher()
{
@@ -772,13 +1000,16 @@ namespace Flow.Launcher.ViewModel
public void Show()
{
- SelectedResults = Results;
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ SelectedResults = Results;
- MainWindowVisibility = Visibility.Visible;
+ MainWindowVisibility = Visibility.Visible;
- MainWindowVisibilityStatus = true;
+ MainWindowOpacity = 1;
- MainWindowOpacity = 1;
+ MainWindowVisibilityStatus = true;
+ });
}
public async void Hide()
@@ -786,42 +1017,39 @@ namespace Flow.Launcher.ViewModel
// Trick for no delay
MainWindowOpacity = 0;
- switch (_settings.LastQueryMode)
+ switch (Settings.LastQueryMode)
{
case LastQueryMode.Empty:
ChangeQueryText(string.Empty);
await Task.Delay(100); //Time for change to opacity
break;
case LastQueryMode.Preserved:
- if (_settings.UseAnimation)
+ if (Settings.UseAnimation)
await Task.Delay(100);
LastQuerySelected = true;
break;
case LastQueryMode.Selected:
- if (_settings.UseAnimation)
+ if (Settings.UseAnimation)
await Task.Delay(100);
LastQuerySelected = false;
break;
default:
- throw new ArgumentException($"wrong LastQueryMode: <{_settings.LastQueryMode}>");
+ throw new ArgumentException($"wrong LastQueryMode: <{Settings.LastQueryMode}>");
}
MainWindowVisibilityStatus = false;
MainWindowVisibility = Visibility.Collapsed;
}
- #endregion
-
-
///
/// Checks if Flow Launcher should ignore any hotkeys
///
public bool ShouldIgnoreHotkeys()
{
- return _settings.IgnoreHotkeysOnFullscreen && WindowsInteropHelper.IsWindowFullscreen();
+ return Settings.IgnoreHotkeysOnFullscreen && WindowsInteropHelper.IsWindowFullscreen() || GameModeStatus;
}
-
+ #endregion
#region Public Methods
@@ -891,28 +1119,26 @@ namespace Flow.Launcher.ViewModel
var result = Results.SelectedItem?.Result;
if (result != null)
{
- string copyText = string.IsNullOrEmpty(result.CopyText) ? result.SubTitle : result.CopyText;
+ string copyText = result.CopyText;
var isFile = File.Exists(copyText);
var isFolder = Directory.Exists(copyText);
if (isFile || isFolder)
{
- var paths = new StringCollection();
- paths.Add(copyText);
+ var paths = new StringCollection
+ {
+ copyText
+ };
Clipboard.SetFileDropList(paths);
App.API.ShowMsg(
- App.API.GetTranslation("copy")
- +" "
- + (isFile? App.API.GetTranslation("fileTitle") : App.API.GetTranslation("folderTitle")),
+ $"{App.API.GetTranslation("copy")} {(isFile ? App.API.GetTranslation("fileTitle") : App.API.GetTranslation("folderTitle"))}",
App.API.GetTranslation("completedSuccessfully"));
}
else
{
- Clipboard.SetDataObject(copyText.ToString());
+ Clipboard.SetDataObject(copyText);
App.API.ShowMsg(
- App.API.GetTranslation("copy")
- + " "
- + App.API.GetTranslation("textTitle"),
+ $"{App.API.GetTranslation("copy")} {App.API.GetTranslation("textTitle")}",
App.API.GetTranslation("completedSuccessfully"));
}
}
@@ -925,4 +1151,4 @@ namespace Flow.Launcher.ViewModel
#endregion
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
new file mode 100644
index 000000000..bc98efabc
--- /dev/null
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -0,0 +1,64 @@
+using System;
+using Flow.Launcher.Core.ExternalPlugins;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.ViewModel
+{
+ public class PluginStoreItemViewModel : BaseModel
+ {
+ public PluginStoreItemViewModel(UserPlugin plugin)
+ {
+ _plugin = plugin;
+ }
+
+ private UserPlugin _plugin;
+
+ public string ID => _plugin.ID;
+ public string Name => _plugin.Name;
+ public string Description => _plugin.Description;
+ public string Author => _plugin.Author;
+ public string Version => _plugin.Version;
+ public string Language => _plugin.Language;
+ public string Website => _plugin.Website;
+ public string UrlDownload => _plugin.UrlDownload;
+ public string UrlSourceCode => _plugin.UrlSourceCode;
+ public string IcoPath => _plugin.IcoPath;
+
+ public bool LabelInstalled => PluginManager.GetPluginForId(_plugin.ID) != null;
+ public bool LabelUpdate => LabelInstalled && VersionConvertor(_plugin.Version) > VersionConvertor(PluginManager.GetPluginForId(_plugin.ID).Metadata.Version);
+
+ internal const string None = "None";
+ internal const string RecentlyUpdated = "RecentlyUpdated";
+ internal const string NewRelease = "NewRelease";
+ internal const string Installed = "Installed";
+
+ public Version VersionConvertor(string version)
+ {
+ Version ResultVersion = new Version(version);
+ return ResultVersion;
+ }
+
+ public string Category
+ {
+ get
+ {
+ string category = None;
+ if (DateTime.Now - _plugin.LatestReleaseDate < TimeSpan.FromDays(7))
+ {
+ category = RecentlyUpdated;
+ }
+ if (DateTime.Now - _plugin.DateAdded < TimeSpan.FromDays(7))
+ {
+ category = NewRelease;
+ }
+ if (PluginManager.GetPluginForId(_plugin.ID) != null)
+ {
+ category = Installed;
+ }
+
+ return category;
+ }
+ }
+ }
+}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 738bd0ec4..65ba657ba 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -1,13 +1,16 @@
+using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using Flow.Launcher.Plugin;
using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Core.Plugin;
using System.Windows.Controls;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core.Resource;
namespace Flow.Launcher.ViewModel
{
- public class PluginViewModel : BaseModel
+ public partial class PluginViewModel : BaseModel
{
private readonly PluginPair _pluginPair;
public PluginPair PluginPair
@@ -24,19 +27,56 @@ namespace Flow.Launcher.ViewModel
}
}
- public ImageSource Image => ImageLoader.Load(PluginPair.Metadata.IcoPath);
+
+ private async void LoadIconAsync()
+ {
+ Image = await ImageLoader.LoadAsync(PluginPair.Metadata.IcoPath);
+ }
+
+ public ImageSource Image
+ {
+ get
+ {
+ if (_image == ImageLoader.MissingImage)
+ LoadIconAsync();
+
+ return _image;
+ }
+ set => _image = value;
+ }
public bool PluginState
{
get => !PluginPair.Metadata.Disabled;
set => PluginPair.Metadata.Disabled = !value;
}
+ public bool IsExpanded
+ {
+ get => _isExpanded;
+ set
+ {
+ _isExpanded = value;
+
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(SettingControl));
+ }
+ }
private Control _settingControl;
- public Control SettingControl => _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider ? new Control() : settingProvider.CreateSettingPanel();
+ private bool _isExpanded;
+ public Control SettingControl
+ => IsExpanded
+ ? _settingControl
+ ??= PluginPair.Plugin is not ISettingProvider settingProvider
+ ? new Control()
+ : settingProvider.CreateSettingPanel()
+ : null;
+ private ImageSource _image = ImageLoader.MissingImage;
public Visibility ActionKeywordsVisibility => PluginPair.Metadata.ActionKeywords.Count == 1 ? Visibility.Visible : Visibility.Collapsed;
public string InitilizaTime => PluginPair.Metadata.InitTime + "ms";
public string QueryTime => PluginPair.Metadata.AvgQueryTime + "ms";
+ public string Version => InternationalizationManager.Instance.GetTranslation("plugin_query_version") + " " + PluginPair.Metadata.Version;
+ public string InitAndQueryTime => InternationalizationManager.Instance.GetTranslation("plugin_init_time") + " " + PluginPair.Metadata.InitTime + "ms, " + InternationalizationManager.Instance.GetTranslation("plugin_query_time") + " " + PluginPair.Metadata.AvgQueryTime + "ms";
public string ActionKeywordsText => string.Join(Query.ActionKeywordSeparator, PluginPair.Metadata.ActionKeywords);
public int Priority => PluginPair.Metadata.Priority;
@@ -52,7 +92,29 @@ namespace Flow.Launcher.ViewModel
OnPropertyChanged(nameof(Priority));
}
+ [RelayCommand]
+ private void EditPluginPriority()
+ {
+ PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(PluginPair.Metadata.ID, this);
+ priorityChangeWindow.ShowDialog();
+ }
+
+ [RelayCommand]
+ private void OpenPluginDirectory()
+ {
+ var directory = PluginPair.Metadata.PluginDirectory;
+ if (!string.IsNullOrEmpty(directory))
+ PluginManager.API.OpenDirectory(directory);
+ }
+
public static bool IsActionKeywordRegistered(string newActionKeyword) => PluginManager.ActionKeywordRegistered(newActionKeyword);
+
+ [RelayCommand]
+ private void SetActionKeywords()
+ {
+ ActionKeywords changeKeywordsWindow = new ActionKeywords(this);
+ changeKeywordsWindow.ShowDialog();
+ }
}
}
diff --git a/Flow.Launcher/ViewModel/RelayCommand.cs b/Flow.Launcher/ViewModel/RelayCommand.cs
index ee4140ed5..e8d4af8b5 100644
--- a/Flow.Launcher/ViewModel/RelayCommand.cs
+++ b/Flow.Launcher/ViewModel/RelayCommand.cs
@@ -5,7 +5,7 @@ namespace Flow.Launcher.ViewModel
{
public class RelayCommand : ICommand
{
- private Action
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
new file mode 100644
index 000000000..0f7a95571
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Marcadores del Navegador
+ Busca en los marcadores de tu navegador
+
+
+ Datos de Marcadores
+ Abrir marcadores en:
+ Nueva ventana
+ Nueva pestaña
+ Establecer navegador desde ruta:
+ Elegir
+ Copiar url
+ Copiar la url del marcador al portapapeles
+ Cargar navegador desde:
+ Nombre del Navegador
+ Ruta del Directorio de Datos
+ Añadir
+ Editar
+ Eliminar
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
new file mode 100644
index 000000000..3bbf50017
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Marcadores del navegador
+ Busca en los marcadores del navegador
+
+
+ Datos de marcador
+ Abrir marcadores en:
+ Nueva ventana
+ Nueva pestaña
+ Establecer navegador desde ruta:
+ Elegir
+ Copiar url
+ Copia la url del marcador al portapapeles
+ Cargar navegador desde:
+ Nombre del navegador
+ Ruta del directorio de datos
+ Añadir
+ Editar
+ Eliminar
+ Navegar
+ Otros
+ Motor del navegador
+ Si no está utilizando Chrome, Firefox o Edge, o si está utilizando su versión portátil, debe añadir el directorio de datos de los marcadores y seleccionar el motor del navegador correcto para que este complemento funcione.
+ Por ejemplo: El motor de Brave es Chromium; y la ubicación por defecto de los datos de los marcadores es: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para el motor de Firefox, el directorio de los marcadores es la carpeta de datos del usuario que contiene el archivo places.sqlite.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
new file mode 100644
index 000000000..602d66e49
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Favoris du Navigateur
+ Rechercher dans les favoris de votre navigateur
+
+
+ Données des favoris
+ Ouvrir les favoris dans :
+ Nouvelle fenêtre
+ Nouvel onglet
+ Définir le navigateur à partir du chemin :
+ Choisir
+ Copier l'url
+ Copier l'Url du favori dans le presse-papier
+ Charger le navigateur depuis :
+ Nom du navigateur
+ Répertoire des Données
+ Ajouter
+ Modifier
+ Supprimer
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
new file mode 100644
index 000000000..040a43378
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Segnalibri del Browser
+ Cerca nei segnalibri del tuo browser
+
+
+ Dati del segnalibro
+ Apri preferiti in:
+ Nuova finestra
+ Nuova scheda
+ Imposta il browser dal percorso:
+ Scegli
+ Copia url
+ Copia l'url del segnalibro negli appunti
+ Carica Il Browser Da:
+ Nome del browser
+ Percorso cartella Data
+ Aggiungi
+ Modifica
+ Cancella
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
new file mode 100644
index 000000000..d278faf98
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ 追
+ 編
+ 削除
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
new file mode 100644
index 000000000..8010e56f4
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ 브라우저 북마크
+ 브라우저의 북마크 검색
+
+
+ 북마크 데이터
+ Open bookmarks in:
+ 새 창
+ 새 탭
+ Set browser from path:
+ 선택
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ 브라우저 이름
+ 데이터 디렉토리 위치
+ 추가
+ 편집
+ 삭제
+ 찾아보기
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
new file mode 100644
index 000000000..90f4ea49b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Add
+ Edit
+ Delete
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
new file mode 100644
index 000000000..319606d22
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Toevoegen
+ Bewerken
+ Verwijder
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
new file mode 100644
index 000000000..0a78aeb7b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Dodaj
+ Edytuj
+ Usu
+ Przeglądaj
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
new file mode 100644
index 000000000..18fed7cd7
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Favoritos do Navegador
+ Pesquisar favoritos do seu navegador
+
+
+ Dados de Favorito
+ Abrir favoritos em:
+ Nova janela
+ Nova aba
+ Definir navegador pelo caminho:
+ Escolha
+ Copiar link
+ Copiar o link do favorito para a área de transferência
+ Carregar navegador de:
+ Nome do Navegador
+ Caminho do Diretório de Dados
+ Adicionar
+ Editar
+ Apagar
+ Navegar
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
index 82c4888bd..4344e8c3d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
@@ -1,8 +1,5 @@
-
-
+
+
Marcadores do navegador
@@ -16,10 +13,16 @@
Caminho do navegador:
Escolher
Copiar URL
- Copiar URL do marcador para área de transferência
- Carregar navegador de:
+ Copiar URL do marcador para a área de transferência
+ Carregar navegador em:
Nome do navegador
- Caminho do diretório de dados
+ Caminho da pasta de dados
Adicionar
+ Editar
Eliminar
+ Explorar
+ Outros
+ Motor do navegador
+ Se não estiver a usar o Chrome, Firefox ou Edge ou se estiver a usar a versão portátil, tem que adicionar o diretório de dados dos marcadores e selecionar o motor do navegador para que este plugin funcione.
+ Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegafor Firefox, o diretório de marcadores é a pasta do utilizador que contém o ficheiro places.sqlite.
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
new file mode 100644
index 000000000..2ebb286a4
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Закладки браузера
+ Поиск закладок в браузере
+
+
+ Данные закладок
+ Открыть закладки в:
+ Новом окне
+ Новой вкладке
+ Установить браузер по пути:
+ Выбор
+ Скопировать URL-адрес
+ Скопируйте URL закладки в буфер обмена
+ Загрузить браузер из:
+ Название браузера
+ Путь к каталогу данных
+ Добавить
+ Редактировать
+ Удалить
+ Обзор
+ Другое
+ Движок браузера
+ Если вы не используете Chrome, Firefox или Edge, или используете их портативную версию, вам необходимо добавить каталог данных закладок и выбрать правильный движок браузера, чтобы этот плагин работал.
+ Например: Движок Brave - Chromium; и его местоположение данных закладок по умолчанию: «%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData». Для движка Firefox каталог закладок находится в папке userdata и содержит файл places.sqlite.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
index b45b437a8..3c1ce9d22 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
@@ -18,5 +18,11 @@
Názov prehliadača
Umiestnenie priečinku s dátami
Pridať
+ Upraviť
Odstrániť
+ Prehliadať
+ Iné
+ Jadro prehliadača
+ Ak nepoužívate prehliadač Chrome, Firefox alebo Edge alebo používate ich prenosnú verziu, musíte pridať priečinok s údajmi o záložkách a vybrať správne jadro prehliadača, aby tento plugin fungoval.
+ Napríklad: Prehliadač Brave má jadro Chromium; predvolené umiestnenie údajov o záložkách je: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Pre jadro Firefoxu je priečinkom záložiek priečinok userdata, ktorý obsahuje súbor places.sqlite.
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
new file mode 100644
index 000000000..be113c8cf
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Dodaj
+ Izmeni
+ Obriši
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
index dbfad64f4..05e97f2c0 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
@@ -1,9 +1,28 @@
-
-
-
- Yer İşaretleri
- Tarayıcılarınızdaki yer işaretlerini arayın.
-
-
\ No newline at end of file
+
+
+
+
+ Yer İşaretleri
+ Tarayıcılarınızdaki yer işaretlerini arayın.
+
+
+ Yer İmleri Verisi
+ Open bookmarks in:
+ Yeni Pencere
+ Yeni Sekme
+ Dizin üzerinden tarayıcı seç:
+ Seç
+ Url Kopyala
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Ekle
+ Düzenle
+ Sil
+ Gözat
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
new file mode 100644
index 000000000..a55b9de1b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Додати
+ Редагувати
+ Видалити
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
index 288e3ed94..7b628702d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
@@ -1,17 +1,28 @@
-
-
-
- 浏览器书签
- 搜索您的浏览器书签
-
-
- 在以下位置打开书签:
- 新窗口
- 新标签
- 设置浏览器路径:
- 选择
- 复制网址
- 将书签的网址复制到剪贴板
-
\ No newline at end of file
+
+
+
+
+ 浏览器书签
+ 搜索您的浏览器书签
+
+
+ 书签数据
+ 在以下位置打开书签:
+ 新窗口
+ 新标签
+ 设置浏览器路径:
+ 选择
+ 复制网址
+ 将书签的网址复制到剪贴板
+ 从以下浏览器加载:
+ 浏览器名称
+ 数据文件路径
+ 添加
+ 编辑
+ 删除
+ 浏览
+ 其他
+ 浏览器引擎
+ 如果你没有使用 Chrome、 Firefox 或 Edge,或者正在使用它们的绿色版, 那么你需要添加书签数据目录并选择正确的浏览器引擎才能使此插件正常工作。
+ 例如:Brave 浏览器的引擎是 Chromium;其默认书签数据位置是 "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData"。 对于 Firefox 引擎的浏览器,书签目录是 places.sqlite 文件所在的用户数据文件夹。
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
new file mode 100644
index 000000000..95bca0684
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ 瀏覽器書籤
+ 搜尋你的瀏覽器書籤
+
+
+ 書籤資料
+ 載入書籤至:
+ 新增視窗
+ 新增分頁
+ 設定瀏覽器路徑:
+ 選擇
+ 複製網址
+ 複製書籤網址
+ 載入瀏覽器自:
+ 瀏覽器名稱
+ 檔案目錄路徑
+ 新增
+ 編輯
+ 刪除
+ 瀏覽
+ 其他
+ 瀏覽器引擎
+ 如果你沒有使用 Chrome、Firefox 或 Edge,或者使用它們的便攜版,你需要添加書籤資料位置並選擇正確的瀏覽器引擎,才能讓這個插件正常運作。
+ 例如:Brave 瀏覽器的引擎是 Chromium;而它的預設書籤資料位置是「%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData」。對於 Firefox 瀏覽器引擎,書籤資料位置是包含 places.sqlite 檔案的 userdata 資料夾。
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 1d58f84d8..d9a719272 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -9,24 +9,29 @@ using Flow.Launcher.Plugin.BrowserBookmark.Commands;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Flow.Launcher.Plugin.BrowserBookmark.Views;
using Flow.Launcher.Plugin.SharedCommands;
+using System.IO;
+using System.Threading.Channels;
+using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.BrowserBookmark
{
- public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContextMenu
+ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContextMenu, IDisposable
{
- private PluginInitContext context;
+ private static PluginInitContext context;
- private List cachedBookmarks = new List();
-
- private Settings _settings { get; set;}
+ private static List cachedBookmarks = new List();
+ private static Settings _settings;
+
public void Init(PluginInitContext context)
{
- this.context = context;
+ Main.context = context;
_settings = context.API.LoadSettingJsonStorage();
cachedBookmarks = BookmarkLoader.LoadAllBookmarks(_settings);
+
+ _ = MonitorRefreshQueue();
}
public List Query(Query query)
@@ -52,7 +57,10 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
return true;
},
- ContextData = new BookmarkAttributes { Url = c.Url }
+ ContextData = new BookmarkAttributes
+ {
+ Url = c.Url
+ }
}).Where(r => r.Score > 0);
return returnList.ToList();
}
@@ -69,12 +77,70 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
context.API.OpenUrl(c.Url);
return true;
},
- ContextData = new BookmarkAttributes { Url = c.Url }
+ ContextData = new BookmarkAttributes
+ {
+ Url = c.Url
+ }
}).ToList();
}
}
+
+ private static Channel refreshQueue = Channel.CreateBounded(1);
+
+ private async Task MonitorRefreshQueue()
+ {
+ var reader = refreshQueue.Reader;
+ while (await reader.WaitToReadAsync())
+ {
+ await Task.Delay(2000);
+ if (reader.TryRead(out _))
+ {
+ ReloadData();
+ }
+ }
+ }
+
+ private static readonly List Watchers = new();
+
+ internal static void RegisterBookmarkFile(string path)
+ {
+ var directory = Path.GetDirectoryName(path);
+ if (!Directory.Exists(directory))
+ return;
+ var watcher = new FileSystemWatcher(directory!);
+ if (File.Exists(path))
+ {
+ var fileName = Path.GetFileName(path);
+ watcher.Filter = fileName;
+ }
+
+ watcher.NotifyFilter = NotifyFilters.FileName |
+ NotifyFilters.LastAccess |
+ NotifyFilters.LastWrite |
+ NotifyFilters.Size;
+
+ watcher.Changed += static (_, _) =>
+ {
+ refreshQueue.Writer.TryWrite(default);
+ };
+
+ watcher.Renamed += static (_, _) =>
+ {
+ refreshQueue.Writer.TryWrite(default);
+ };
+
+ watcher.EnableRaisingEvents = true;
+
+ Watchers.Add(watcher);
+ }
+
public void ReloadData()
+ {
+ ReloadAllBookmarks();
+ }
+
+ public static void ReloadAllBookmarks()
{
cachedBookmarks.Clear();
@@ -98,7 +164,8 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
public List LoadContextMenus(Result selectedResult)
{
- return new List() {
+ return new List()
+ {
new Result
{
Title = context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copyurl_title"),
@@ -114,20 +181,29 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
catch (Exception e)
{
var message = "Failed to set url in clipboard";
- Log.Exception("Main",message, e, "LoadContextMenus");
+ Log.Exception("Main", message, e, "LoadContextMenus");
context.API.ShowMsg(message);
return false;
}
},
- IcoPath = "Images\\copylink.png"
- }};
+ IcoPath = "Images\\copylink.png",
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8")
+ }
+ };
}
internal class BookmarkAttributes
{
internal string Url { get; set; }
}
+ public void Dispose()
+ {
+ foreach (var watcher in Watchers)
+ {
+ watcher.Dispose();
+ }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
index c19de08a4..69bb56e48 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
@@ -4,6 +4,8 @@
{
private string _name;
private string _dataDirectoryPath;
+ private BrowserType browserType = BrowserType.Chromium;
+
public string Name
{
get => _name;
@@ -13,6 +15,7 @@
OnPropertyChanged(nameof(Name));
}
}
+
public string DataDirectoryPath
{
get => _dataDirectoryPath;
@@ -22,5 +25,21 @@
OnPropertyChanged(nameof(DataDirectoryPath));
}
}
+
+ public BrowserType BrowserType
+ {
+ get => browserType;
+ set
+ {
+ browserType = value;
+ OnPropertyChanged(nameof(BrowserType));
+ }
+ }
}
-}
\ No newline at end of file
+
+ public enum BrowserType
+ {
+ Chromium,
+ Firefox,
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
index 5080ad301..17b794e03 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
@@ -10,6 +10,10 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Models
public string BrowserPath { get; set; }
+ public bool LoadChromeBookmark { get; set; } = true;
+ public bool LoadFirefoxBookmark { get; set; } = true;
+ public bool LoadEdgeBookmark { get; set; } = true;
+
public ObservableCollection CustomChromiumBrowsers { get; set; } = new();
}
}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
index 4d23bd060..392c9e0a7 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
@@ -5,8 +5,9 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Flow.Launcher.Plugin.BrowserBookmark.Models"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:ui="clr-namespace:Flow.Launcher.Infrastructure.UI;assembly=Flow.Launcher.Infrastructure"
Title="{DynamicResource flowlauncher_plugin_browserbookmark_bookmarkDataSetting}"
- Width="520"
+ Width="550"
Background="{DynamicResource PopuBGColor}"
Foreground="{DynamicResource PopupTextColor}"
KeyDown="WindowKeyDown"
@@ -38,7 +39,7 @@
-
-
+
+
@@ -80,17 +80,46 @@
+
+
-
+
+
+
+
+
+
+
-
+ LastChildFill="True">
+
+
+
@@ -128,13 +187,13 @@
x:Name="btnCancel"
MinWidth="145"
Margin="0,0,5,0"
- Click="ConfirmCancelEditCustomBrowser"
+ Click="CancelEditCustomBrowser"
Content="{DynamicResource cancel}" />
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs
index b243878f7..bdef5bf0f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml.cs
@@ -1,17 +1,7 @@
using Flow.Launcher.Plugin.BrowserBookmark.Models;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Shapes;
+using System.Windows.Forms;
namespace Flow.Launcher.Plugin.BrowserBookmark.Views
{
@@ -27,31 +17,41 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views
currentCustomBrowser = browser;
DataContext = new CustomBrowser
{
- Name = browser.Name, DataDirectoryPath = browser.DataDirectoryPath
+ Name = browser.Name,
+ DataDirectoryPath = browser.DataDirectoryPath,
+ BrowserType = browser.BrowserType,
};
}
-
- private void ConfirmCancelEditCustomBrowser(object sender, RoutedEventArgs e)
+
+ private void ConfirmEditCustomBrowser(object sender, RoutedEventArgs e)
{
- if (DataContext is CustomBrowser editBrowser && e.Source is Button button)
- {
- if (button.Name == "btnConfirm")
- {
- currentCustomBrowser.Name = editBrowser.Name;
- currentCustomBrowser.DataDirectoryPath = editBrowser.DataDirectoryPath;
- Close();
- }
- }
-
+ CustomBrowser editBrowser = (CustomBrowser)DataContext;
+ currentCustomBrowser.Name = editBrowser.Name;
+ currentCustomBrowser.DataDirectoryPath = editBrowser.DataDirectoryPath;
+ currentCustomBrowser.BrowserType = editBrowser.BrowserType;
+ DialogResult = true;
Close();
}
- private void WindowKeyDown(object sender, KeyEventArgs e)
+ private void CancelEditCustomBrowser(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void WindowKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
- ConfirmCancelEditCustomBrowser(sender, e);
+ ConfirmEditCustomBrowser(sender, e);
}
}
+
+ private void OnSelectPathClick(object sender, RoutedEventArgs e)
+ {
+ var dialog = new FolderBrowserDialog();
+ dialog.ShowDialog();
+ CustomBrowser editBrowser = (CustomBrowser)DataContext;
+ editBrowser.DataDirectoryPath = dialog.SelectedPath;
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
index 09ad2101b..014deff03 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
@@ -8,40 +8,77 @@
d:DesignWidth="500"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
mc:Ignorable="d">
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+ BorderBrush="DarkGray"
+ BorderThickness="1"
+ ItemsSource="{Binding Settings.CustomChromiumBrowsers}"
+ MouseDoubleClick="MouseDoubleClickOnSelectedCustomBrowser"
+ SelectedItem="{Binding SelectedCustomBrowser}"
+ Style="{StaticResource {x:Static GridView.GridViewStyleKey}}">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
index 5f5d3246c..2947c2cb5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
@@ -1,16 +1,47 @@
-using System.Windows;
+using System.Windows;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using System.Windows.Input;
using System.ComponentModel;
+using System.Threading.Tasks;
namespace Flow.Launcher.Plugin.BrowserBookmark.Views
{
public partial class SettingsControl : INotifyPropertyChanged
{
public Settings Settings { get; }
-
+
public CustomBrowser SelectedCustomBrowser { get; set; }
-
+
+ public bool LoadChromeBookmark
+ {
+ get => Settings.LoadChromeBookmark;
+ set
+ {
+ Settings.LoadChromeBookmark = value;
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
+ }
+ }
+
+ public bool LoadFirefoxBookmark
+ {
+ get => Settings.LoadFirefoxBookmark;
+ set
+ {
+ Settings.LoadFirefoxBookmark = value;
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
+ }
+ }
+
+ public bool LoadEdgeBookmark
+ {
+ get => Settings.LoadEdgeBookmark;
+ set
+ {
+ Settings.LoadEdgeBookmark = value;
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
+ }
+ }
+
public bool OpenInNewBrowserWindow
{
get => Settings.OpenInNewBrowserWindow;
@@ -41,6 +72,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views
})
{
Settings.CustomChromiumBrowsers.Add(newBrowser);
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
@@ -49,15 +81,42 @@ namespace Flow.Launcher.Plugin.BrowserBookmark.Views
if (CustomBrowsers.SelectedItem is CustomBrowser selectedCustomBrowser)
{
Settings.CustomChromiumBrowsers.Remove(selectedCustomBrowser);
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
}
}
+
private void MouseDoubleClickOnSelectedCustomBrowser(object sender, MouseButtonEventArgs e)
+ {
+ EditSelectedCustomBrowser();
+ }
+
+ private void Others_Click(object sender, RoutedEventArgs e)
+ {
+
+ if (CustomBrowsersList.Visibility == Visibility.Collapsed)
+ {
+ CustomBrowsersList.Visibility = Visibility.Visible;
+ }
+ else
+ CustomBrowsersList.Visibility = Visibility.Collapsed;
+ }
+
+ private void EditCustomBrowser(object sender, RoutedEventArgs e)
+ {
+ EditSelectedCustomBrowser();
+ }
+
+ private void EditSelectedCustomBrowser()
{
if (SelectedCustomBrowser is null)
return;
var window = new CustomBrowserSettingWindow(SelectedCustomBrowser);
- window.ShowDialog();
+ var result = window.ShowDialog() ?? false;
+ if (result)
+ {
+ _ = Task.Run(() => Main.ReloadAllBookmarks());
+ }
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
index afc4f9855..99f2b78b4 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
@@ -4,7 +4,7 @@
"Name": "Browser Bookmarks",
"Description": "Search your browser bookmarks",
"Author": "qianlifeng, Ioannis G.",
- "Version": "1.6.3",
+ "Version": "3.1.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x64/SQLite.Interop.dll b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x64/SQLite.Interop.dll
deleted file mode 100644
index 877b4d78e..000000000
Binary files a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x64/SQLite.Interop.dll and /dev/null differ
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x86/SQLite.Interop.dll b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x86/SQLite.Interop.dll
deleted file mode 100644
index ccb5e03b6..000000000
Binary files a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/x86/SQLite.Interop.dll and /dev/null differ
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
index b4f3c3c58..ac0da1c6f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
@@ -1,11 +1,5 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Globalization;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Flow.Launcher.Core;
+using System.ComponentModel;
+using Flow.Launcher.Core.Resource;
namespace Flow.Launcher.Plugin.Caculator
{
@@ -21,4 +15,4 @@ namespace Flow.Launcher.Plugin.Caculator
[LocalizedDescription("flowlauncher_plugin_calculator_decimal_seperator_comma")]
Comma
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index d7dd507dc..db731fb2c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -2,7 +2,7 @@
Library
- net5.0-windows
+ net7.0-windows
{59BD9891-3837-438A-958D-ADC7F91F6F7E}
Properties
Flow.Launcher.Plugin.Caculator
@@ -62,7 +62,7 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Images/calculator.png b/Plugins/Flow.Launcher.Plugin.Calculator/Images/calculator.png
index 4bdade8b7..81697a8e8 100644
Binary files a/Plugins/Flow.Launcher.Plugin.Calculator/Images/calculator.png and b/Plugins/Flow.Launcher.Plugin.Calculator/Images/calculator.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
new file mode 100644
index 000000000..685bc136c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculadora
+ Permite hacer cálculos matemáticos. (Pruebe con 5*3-2 en Flow Launcher)
+ No es un número (NaN)
+ Expresión incorrecta o incompleta (¿Olvidó algún paréntesis?)
+ Copiar este número al portapapeles
+ Separador decimal
+ El separador decimal que se usará en el resultado.
+ Usar configuración del sistema
+ Coma (,)
+ Punto (.)
+ Número máximo de decimales
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
new file mode 100644
index 000000000..657c471d5
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculadora
+ Permite hacer cálculos matemáticos. (Pruebe 5*3-2 en Flow Launcher)
+ No es un número (NaN)
+ Expresión incorrecta o incompleta (¿Ha olvidado algunos paréntesis?)
+ Copiar este número al portapapeles
+ Separador decimal
+ El separador decimal que se utilizará en la salida.
+ Usar configuración regional del sistema
+ Coma (,)
+ Punto (.)
+ Número máximo de decimales
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
new file mode 100644
index 000000000..7dc4983de
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculatrice
+ Permet de faire des calculs mathématiques.(Essayez 5*3-2 dans Flow Launcher)
+ Pas un nombre (NaN)
+ Expression incorrecte ou incomplète (avez-vous oublié certaines parenthèses ?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
new file mode 100644
index 000000000..7809bcfa1
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calcolatrice
+ Consente di eseguire calcoli matematici (provare 5*3-2 in Flow Launcher)
+ Non è un numero (NaN)
+ Espressione sbagliata o incompleta (avete dimenticato delle parentesi?)
+ Copiare questo numero negli appunti
+ Separatore decimale
+ Il separatore decimale da usare nell'output.
+ Usa il locale del sistema
+ Virgola (,)
+ Punto (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
index f040181b1..aa00d1039 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
@@ -1,8 +1,15 @@
-
-
- Kalkulator
- Szybkie wykonywanie obliczeń matematycznych. (Spróbuj wpisać 5*3-2 w oknie Flow Launchera)
-
-
\ No newline at end of file
+
+
+
+ Kalkulator
+ Szybkie wykonywanie obliczeń matematycznych. (Spróbuj wpisać 5*3-2 w oknie Flow Launchera)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
new file mode 100644
index 000000000..6dd903fa4
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculadora
+ Permite fazer cálculos matemáticos.(Tente 5*3-2 no Flow Launcher)
+ Não é um número (NaN)
+ Expressão errada ou incompleta (Você esqueceu de adicionar parênteses?)
+ Copiar este numero para a área de transferência
+ Separador decimal
+ O separador decimal a ser usado no resultado.
+ Use system locale
+ Vírgula (,)
+ Ponto (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
new file mode 100644
index 000000000..30c557536
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Калькулятор
+ Позволяет выполнять математические вычисления. (Попробуйте 5*3-2 в Flow Launcher)
+ Не является числом (NaN)
+ Выражение неправильное или неполное (Вы забыли скобки?)
+ Скопировать этот номер в буфер обмена
+ Десятичный разделитель
+ Десятичный разделитель, который будет использоваться в результате.
+ Использовать системный язык
+ Запятая (,)
+ Точка (.)
+ Макс. число знаков после запятой
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
index 47b312192..07a287d52 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
@@ -1,10 +1,15 @@
-
-
- Hesap Makinesi
- Matematiksel hesaplamalar yapmaya yarar. (5*3-2 yazmayı deneyin)
- Sayı değil (NaN)
- İfade hatalı ya da eksik. (Parantez koymayı mı unuttunuz?)
- Bu sayıyı panoya kopyala
-
\ No newline at end of file
+
+
+
+ Hesap Makinesi
+ Matematiksel hesaplamalar yapmaya yarar. (5*3-2 yazmayı deneyin)
+ Sayı değil (NaN)
+ İfade hatalı ya da eksik. (Parantez koymayı mı unuttunuz?)
+ Bu sayıyı panoya kopyala
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
new file mode 100644
index 000000000..15598118c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
@@ -0,0 +1,15 @@
+
+
+
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
index a73bc63f2..aada17d5a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
@@ -2,7 +2,7 @@
计算器
- 为Flow Launcher提供数学计算能力。(试着在Flow Launcher输入 5*3-2)
+ 为 Flow Launcher 提供数学计算能力。(试着在 Flow Launcher 输入 5*3-2)
请输入数字
表达错误或不完整(您是否忘记了一些括号?)
将结果复制到剪贴板
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
index 2fe9cc5b8..83df3e7cd 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
@@ -1,8 +1,15 @@
-
-
- 計算機
- 為 Flow Launcher 提供數學計算功能。(試著在 Flow Launcher 輸入 5*3-2)
-
-
+
+
+
+ 計算機
+ 為 Flow Launcher 提供數學計算功能。(試著在 Flow Launcher 輸入 5*3-2)
+ 不是一個數 (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ 複製此數至剪貼簿
+ 小數點分隔符號
+ The decimal separator to be used in the output.
+ 使用系統區域設定
+ 逗號 (,)
+ 點 (.)
+ 小數點後最大位數
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 7de4d30fe..d5dcdacea 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.InteropServices;
@@ -6,7 +6,6 @@ using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using Mages.Core;
-using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin.Caculator.ViewModels;
using Flow.Launcher.Plugin.Caculator.Views;
@@ -25,6 +24,9 @@ namespace Flow.Launcher.Plugin.Caculator
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
private static Engine MagesEngine;
+ private const string comma = ",";
+ private const string dot = ".";
+
private PluginInitContext Context { get; set; }
private static Settings _settings;
@@ -35,7 +37,7 @@ namespace Flow.Launcher.Plugin.Caculator
Context = context;
_settings = context.API.LoadSettingJsonStorage();
_viewModel = new SettingsViewModel(_settings);
-
+
MagesEngine = new Engine(new Configuration
{
Scope = new Dictionary
@@ -54,7 +56,19 @@ namespace Flow.Launcher.Plugin.Caculator
try
{
- var expression = query.Search.Replace(",", ".");
+ string expression;
+
+ switch (_settings.DecimalSeparator)
+ {
+ case DecimalSeparator.Comma:
+ case DecimalSeparator.UseSystemLocale when CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator == ",":
+ expression = query.Search.Replace(",", ".");
+ break;
+ default:
+ expression = query.Search;
+ break;
+ }
+
var result = MagesEngine.Interpret(expression);
if (result?.ToString() == "NaN")
@@ -76,6 +90,7 @@ namespace Flow.Launcher.Plugin.Caculator
IcoPath = "Images/calculator.png",
Score = 300,
SubTitle = Context.API.GetTranslation("flowlauncher_plugin_calculator_copy_number_to_clipboard"),
+ CopyText = newResult,
Action = c =>
{
try
@@ -83,7 +98,7 @@ namespace Flow.Launcher.Plugin.Caculator
Clipboard.SetDataObject(newResult);
return true;
}
- catch (ExternalException e)
+ catch (ExternalException)
{
MessageBox.Show("Copy failed, please try later");
return false;
@@ -119,6 +134,10 @@ namespace Flow.Launcher.Plugin.Caculator
return false;
}
+ if ((query.Search.Contains(dot) && GetDecimalSeparator() != dot) ||
+ (query.Search.Contains(comma) && GetDecimalSeparator() != comma))
+ return false;
+
return true;
}
@@ -138,12 +157,12 @@ namespace Flow.Launcher.Plugin.Caculator
private string GetDecimalSeparator()
{
- string systemDecimalSeperator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
+ string systemDecimalSeperator = CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator;
switch (_settings.DecimalSeparator)
{
case DecimalSeparator.UseSystemLocale: return systemDecimalSeperator;
- case DecimalSeparator.Dot: return ".";
- case DecimalSeparator.Comma: return ",";
+ case DecimalSeparator.Dot: return dot;
+ case DecimalSeparator.Comma: return comma;
default: return systemDecimalSeperator;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs
index 10cee364b..615514873 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs
@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
+
namespace Flow.Launcher.Plugin.Caculator
{
public class Settings
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
index c0621a2d9..9fd4bb17c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
@@ -3,7 +3,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:calculator="clr-namespace:Flow.Launcher.Plugin.Caculator"
- xmlns:core="clr-namespace:Flow.Launcher.Core;assembly=Flow.Launcher.Core"
+ xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="clr-namespace:Flow.Launcher.Infrastructure.UI;assembly=Flow.Launcher.Infrastructure"
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 0b0921868..5f27a088d 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Calculator",
"Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)",
"Author": "cxfksword",
- "Version": "1.1.9",
+ "Version": "3.0.1",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Caculator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index f499274a9..f5733bbb5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@@ -9,6 +9,8 @@ using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using System.Linq;
+using System.Windows.Controls;
+using System.Windows.Input;
using MessageBox = System.Windows.Forms.MessageBox;
using MessageBoxIcon = System.Windows.Forms.MessageBoxIcon;
using MessageBoxButton = System.Windows.Forms.MessageBoxButtons;
@@ -37,39 +39,47 @@ namespace Flow.Launcher.Plugin.Explorer
var contextMenus = new List();
if (selectedResult.ContextData is SearchResult record)
{
- if (record.Type == ResultType.File)
- contextMenus.Add(CreateOpenWithEditorResult(record));
+ if (record.Type == ResultType.File && !string.IsNullOrEmpty(Settings.EditorPath))
+ contextMenus.Add(CreateOpenWithEditorResult(record, Settings.EditorPath));
- if (record.Type == ResultType.Folder && record.WindowsIndexed)
- contextMenus.Add(CreateAddToIndexSearchExclusionListResult(record));
+ if ((record.Type == ResultType.Folder || record.Type == ResultType.Volume) && !string.IsNullOrEmpty(Settings.FolderEditorPath))
+ contextMenus.Add(CreateOpenWithEditorResult(record, Settings.FolderEditorPath));
+
+ if (record.Type == ResultType.Folder)
+ {
+ contextMenus.Add(CreateOpenWithShellResult(record));
+ if (record.WindowsIndexed)
+ {
+ contextMenus.Add(CreateAddToIndexSearchExclusionListResult(record));
+ }
+ }
contextMenus.Add(CreateOpenContainingFolderResult(record));
- contextMenus.Add(CreateOpenWindowsIndexingOptions());
-
- if (record.ShowIndexState)
- contextMenus.Add(new Result {Title = "From index search: " + (record.WindowsIndexed ? "Yes" : "No"),
- SubTitle = "Location: " + record.FullPath,
- Score = 501, IcoPath = Constants.IndexImagePath});
+ if (record.WindowsIndexed)
+ {
+ contextMenus.Add(CreateOpenWindowsIndexingOptions());
+ }
var icoPath = (record.Type == ResultType.File) ? Constants.FileImagePath : Constants.FolderImagePath;
- var fileOrFolder = (record.Type == ResultType.File) ? "file" : "folder";
+ bool isFile = record.Type == ResultType.File;
- if (!Settings.QuickAccessLinks.Any(x => x.Path == record.FullPath))
+ if (Settings.QuickAccessLinks.All(x => !x.Path.Equals(record.FullPath, StringComparison.OrdinalIgnoreCase)))
{
contextMenus.Add(new Result
{
Title = Context.API.GetTranslation("plugin_explorer_add_to_quickaccess_title"),
- SubTitle = string.Format(Context.API.GetTranslation("plugin_explorer_add_to_quickaccess_subtitle"), fileOrFolder),
+ SubTitle = Context.API.GetTranslation("plugin_explorer_add_to_quickaccess_subtitle"),
Action = (context) =>
{
- Settings.QuickAccessLinks.Add(new AccessLink { Path = record.FullPath, Type = record.Type });
+ Settings.QuickAccessLinks.Add(new AccessLink
+ {
+ Path = record.FullPath, Type = record.Type
+ });
Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_addfilefoldersuccess"),
- string.Format(
- Context.API.GetTranslation("plugin_explorer_addfilefoldersuccess_detail"),
- fileOrFolder),
- Constants.ExplorerIconImageFullPath);
+ Context.API.GetTranslation("plugin_explorer_addfilefoldersuccess_detail"),
+ Constants.ExplorerIconImageFullPath);
ViewModel.Save();
@@ -77,7 +87,8 @@ namespace Flow.Launcher.Plugin.Explorer
},
SubTitleToolTip = Context.API.GetTranslation("plugin_explorer_contextmenu_titletooltip"),
TitleToolTip = Context.API.GetTranslation("plugin_explorer_contextmenu_titletooltip"),
- IcoPath = Constants.QuickAccessImagePath
+ IcoPath = Constants.QuickAccessImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue718"),
});
}
else
@@ -85,16 +96,14 @@ namespace Flow.Launcher.Plugin.Explorer
contextMenus.Add(new Result
{
Title = Context.API.GetTranslation("plugin_explorer_remove_from_quickaccess_title"),
- SubTitle = string.Format(Context.API.GetTranslation("plugin_explorer_remove_from_quickaccess_subtitle"), fileOrFolder),
+ SubTitle = Context.API.GetTranslation("plugin_explorer_remove_from_quickaccess_subtitle"),
Action = (context) =>
{
- Settings.QuickAccessLinks.Remove(Settings.QuickAccessLinks.FirstOrDefault(x => x.Path == record.FullPath));
+ Settings.QuickAccessLinks.Remove(Settings.QuickAccessLinks.FirstOrDefault(x => string.Equals(x.Path, record.FullPath, StringComparison.OrdinalIgnoreCase)));
Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_removefilefoldersuccess"),
- string.Format(
- Context.API.GetTranslation("plugin_explorer_removefilefoldersuccess_detail"),
- fileOrFolder),
- Constants.ExplorerIconImageFullPath);
+ Context.API.GetTranslation("plugin_explorer_removefilefoldersuccess_detail"),
+ Constants.ExplorerIconImageFullPath);
ViewModel.Save();
@@ -102,15 +111,16 @@ namespace Flow.Launcher.Plugin.Explorer
},
SubTitleToolTip = Context.API.GetTranslation("plugin_explorer_contextmenu_remove_titletooltip"),
TitleToolTip = Context.API.GetTranslation("plugin_explorer_contextmenu_remove_titletooltip"),
- IcoPath = Constants.RemoveQuickAccessImagePath
+ IcoPath = Constants.RemoveQuickAccessImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uecc9")
});
}
-
+
contextMenus.Add(new Result
{
Title = Context.API.GetTranslation("plugin_explorer_copypath"),
- SubTitle = $"Copy the current {fileOrFolder} path to clipboard",
- Action = (context) =>
+ SubTitle = Context.API.GetTranslation("plugin_explorer_copypath_subtitle"),
+ Action = _ =>
{
try
{
@@ -125,64 +135,70 @@ namespace Flow.Launcher.Plugin.Explorer
return false;
}
},
- IcoPath = Constants.CopyImagePath
+ IcoPath = Constants.CopyImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8")
});
contextMenus.Add(new Result
{
- Title = Context.API.GetTranslation("plugin_explorer_copyfilefolder") + $" {fileOrFolder}",
- SubTitle = $"Copy the {fileOrFolder} to clipboard",
- Action = (context) =>
+ Title = Context.API.GetTranslation("plugin_explorer_copyfilefolder"),
+ SubTitle = isFile ? Context.API.GetTranslation("plugin_explorer_copyfile_subtitle") : Context.API.GetTranslation("plugin_explorer_copyfolder_subtitle"),
+ Action = _ =>
{
try
{
- Clipboard.SetFileDropList(new System.Collections.Specialized.StringCollection { record.FullPath });
+ Clipboard.SetFileDropList(new System.Collections.Specialized.StringCollection
+ {
+ record.FullPath
+ });
return true;
}
catch (Exception e)
{
- var message = $"Fail to set {fileOrFolder} in clipboard";
+ var message = $"Fail to set file/folder in clipboard";
LogException(message, e);
Context.API.ShowMsg(message);
return false;
}
},
- IcoPath = icoPath
+ IcoPath = icoPath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uf12b")
});
- if (record.Type == ResultType.File || record.Type == ResultType.Folder)
+
+ if (record.Type is ResultType.File or ResultType.Folder)
contextMenus.Add(new Result
{
- Title = Context.API.GetTranslation("plugin_explorer_deletefilefolder") + $" {fileOrFolder}",
- SubTitle = Context.API.GetTranslation("plugin_explorer_deletefilefolder_subtitle") + $" {fileOrFolder}",
+ Title = Context.API.GetTranslation("plugin_explorer_deletefilefolder"),
+ SubTitle = isFile ? Context.API.GetTranslation("plugin_explorer_deletefile_subtitle") : Context.API.GetTranslation("plugin_explorer_deletefolder_subtitle"),
Action = (context) =>
{
try
{
if (MessageBox.Show(
- string.Format(Context.API.GetTranslation("plugin_explorer_deletefilefolderconfirm"),fileOrFolder),
- string.Empty,
- MessageBoxButton.YesNo,
- MessageBoxIcon.Warning)
+ string.Format(Context.API.GetTranslation("plugin_explorer_delete_folder_link"), record.FullPath),
+ string.Empty,
+ MessageBoxButton.YesNo,
+ MessageBoxIcon.Warning)
== DialogResult.No)
return false;
- if (record.Type == ResultType.File)
+ if (isFile)
File.Delete(record.FullPath);
else
Directory.Delete(record.FullPath, true);
- Task.Run(() =>
+ _ = Task.Run(() =>
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_deletefilefoldersuccess"),
- string.Format(Context.API.GetTranslation("plugin_explorer_deletefilefoldersuccess_detail"), fileOrFolder),
- Constants.ExplorerIconImageFullPath);
+ string.Format(Context.API.GetTranslation("plugin_explorer_deletefilefoldersuccess_detail"), record.FullPath),
+ Constants.ExplorerIconImageFullPath);
});
}
catch (Exception e)
{
- var message = $"Fail to delete {fileOrFolder} at {record.FullPath}";
+ var message = $"Fail to delete {record.FullPath}";
LogException(message, e);
Context.API.ShowMsgError(message);
return false;
@@ -190,9 +206,56 @@ namespace Flow.Launcher.Plugin.Explorer
return true;
},
- IcoPath = Constants.DeleteFileFolderImagePath
+ IcoPath = Constants.DeleteFileFolderImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue74d")
});
+ if (record.Type is not ResultType.Volume)
+ {
+ contextMenus.Add(new Result()
+ {
+ Title = Context.API.GetTranslation("plugin_explorer_show_contextmenu_title"),
+ IcoPath = Constants.ShowContextMenuImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue700"),
+ Action = _ =>
+ {
+ if (record.Type is ResultType.Volume)
+ return false;
+
+ var screenWithMouseCursor = System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var xOfScreenCenter = screenWithMouseCursor.WorkingArea.Left + screenWithMouseCursor.WorkingArea.Width / 2;
+ var yOfScreenCenter = screenWithMouseCursor.WorkingArea.Top + screenWithMouseCursor.WorkingArea.Height / 2;
+ var showPosition = new System.Drawing.Point(xOfScreenCenter, yOfScreenCenter);
+
+ switch (record.Type)
+ {
+ case ResultType.File:
+ {
+ var fileInfos = new FileInfo[]
+ {
+ new(record.FullPath)
+ };
+
+ new Peter.ShellContextMenu().ShowContextMenu(fileInfos, showPosition);
+ break;
+ }
+ case ResultType.Folder:
+ {
+ var directoryInfos = new DirectoryInfo[]
+ {
+ new(record.FullPath)
+ };
+
+ new Peter.ShellContextMenu().ShowContextMenu(directoryInfos, showPosition);
+ break;
+ }
+ }
+
+ return false;
+ },
+ });
+ }
+
if (record.Type == ResultType.File && CanRunAsDifferentUser(record.FullPath))
contextMenus.Add(new Result
{
@@ -202,7 +265,7 @@ namespace Flow.Launcher.Plugin.Explorer
{
try
{
- Task.Run(() => ShellCommand.RunAsDifferentUser(record.FullPath.SetProcessStartInfo()));
+ _ = Task.Run(() => ShellCommand.RunAsDifferentUser(record.FullPath.SetProcessStartInfo()));
}
catch (FileNotFoundException e)
{
@@ -242,16 +305,16 @@ namespace Flow.Launcher.Plugin.Explorer
return true;
},
- IcoPath = Constants.FolderImagePath
+ IcoPath = Constants.FolderImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue838")
};
}
- private Result CreateOpenWithEditorResult(SearchResult record)
- {
- string editorPath = "Notepad.exe"; // TODO add the ability to create a custom editor
- var name = Context.API.GetTranslation("plugin_explorer_openwitheditor")
- + " " + Path.GetFileNameWithoutExtension(editorPath);
+
+ private Result CreateOpenWithEditorResult(SearchResult record, string editorPath)
+ {
+ var name = $"{Context.API.GetTranslation("plugin_explorer_openwitheditor")} {Path.GetFileNameWithoutExtension(editorPath)}";
return new Result
{
@@ -260,21 +323,60 @@ namespace Flow.Launcher.Plugin.Explorer
{
try
{
- Process.Start(editorPath, record.FullPath);
+ Process.Start(new ProcessStartInfo()
+ {
+ FileName = editorPath,
+ ArgumentList = { record.FullPath }
+ });
return true;
}
catch (Exception e)
{
- var message = $"Failed to open editor for file at {record.FullPath}";
+ var raw_message = Context.API.GetTranslation("plugin_explorer_openwitheditor_error");
+ var message = string.Format(raw_message, record.FullPath, Path.GetFileNameWithoutExtension(editorPath), editorPath);
LogException(message, e);
Context.API.ShowMsgError(message);
return false;
}
},
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue70f"),
IcoPath = Constants.FileImagePath
};
}
+ private Result CreateOpenWithShellResult(SearchResult record)
+ {
+ string shellPath = Settings.ShellPath;
+
+ var name = $"{Context.API.GetTranslation("plugin_explorer_openwithshell")} {Path.GetFileNameWithoutExtension(shellPath)}";
+
+ return new Result
+ {
+ Title = name,
+ Action = _ =>
+ {
+ try
+ {
+ Process.Start(new ProcessStartInfo()
+ {
+ FileName = shellPath, WorkingDirectory = record.FullPath
+ });
+ return true;
+ }
+ catch (Exception e)
+ {
+ var raw_message = Context.API.GetTranslation("plugin_explorer_openwithshell_error");
+ var message = string.Format(raw_message, record.FullPath, Path.GetFileNameWithoutExtension(shellPath), shellPath);
+ LogException(message, e);
+ Context.API.ShowMsgError(message);
+ return false;
+ }
+ },
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue756"),
+ IcoPath = Constants.FolderImagePath
+ };
+ }
+
private Result CreateAddToIndexSearchExclusionListResult(SearchResult record)
{
return new Result
@@ -283,14 +385,17 @@ namespace Flow.Launcher.Plugin.Explorer
SubTitle = Context.API.GetTranslation("plugin_explorer_path") + " " + record.FullPath,
Action = _ =>
{
- if(!Settings.IndexSearchExcludedSubdirectoryPaths.Any(x => x.Path == record.FullPath))
- Settings.IndexSearchExcludedSubdirectoryPaths.Add(new AccessLink { Path = record.FullPath });
+ if (!Settings.IndexSearchExcludedSubdirectoryPaths.Any(x => string.Equals(x.Path, record.FullPath, StringComparison.OrdinalIgnoreCase)))
+ Settings.IndexSearchExcludedSubdirectoryPaths.Add(new AccessLink
+ {
+ Path = record.FullPath
+ });
Task.Run(() =>
{
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_excludedfromindexsearch_msg"),
- Context.API.GetTranslation("plugin_explorer_path") +
- " " + record.FullPath, Constants.ExplorerIconImageFullPath);
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_excludedfromindexsearch_msg"),
+ Context.API.GetTranslation("plugin_explorer_path") +
+ " " + record.FullPath, Constants.ExplorerIconImageFullPath);
// so the new path can be persisted to storage and not wait till next ViewModel save.
Context.API.SaveAppAllSettings();
@@ -313,11 +418,11 @@ namespace Flow.Launcher.Plugin.Explorer
try
{
var psi = new ProcessStartInfo
- {
- FileName = "control.exe",
- UseShellExecute = true,
- Arguments = "srchadmin.dll"
- };
+ {
+ FileName = "control.exe",
+ UseShellExecute = true,
+ Arguments = "srchadmin.dll"
+ };
Process.Start(psi);
return true;
@@ -334,7 +439,7 @@ namespace Flow.Launcher.Plugin.Explorer
};
}
- public void LogException(string message, Exception e)
+ private void LogException(string message, Exception e)
{
Log.Exception($"|Flow.Launcher.Plugin.Folder.ContextMenu|{message}", e);
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x64/Everything.dll b/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x64/Everything.dll
new file mode 100644
index 000000000..6d093b793
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x64/Everything.dll differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x86/Everything.dll b/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x86/Everything.dll
new file mode 100644
index 000000000..de73b87d1
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/EverythingSDK/x86/Everything.dll differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/EngineNotAvailableException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/EngineNotAvailableException.cs
new file mode 100644
index 000000000..a6315fb4b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/EngineNotAvailableException.cs
@@ -0,0 +1,63 @@
+#nullable enable
+
+using System;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Flow.Launcher.Plugin.Explorer.Exceptions;
+
+public class EngineNotAvailableException : Exception
+{
+ public string EngineName { get; }
+ public string Resolution { get; }
+ public Func>? Action { get; }
+
+ public string? ErrorIcon { get; init; }
+
+ public EngineNotAvailableException(
+ string engineName,
+ string resolution,
+ string message,
+ Func>? action = null) : base(message)
+ {
+ EngineName = engineName;
+ Resolution = resolution;
+ Action = action ?? (_ =>
+ {
+ Clipboard.SetDataObject(this.ToString());
+ return ValueTask.FromResult(true);
+ });
+ }
+
+ public EngineNotAvailableException(
+ string engineName,
+ string resolution,
+ string message,
+ Exception innerException) : base(message, innerException)
+ {
+ EngineName = engineName;
+ Resolution = resolution;
+ }
+
+ public EngineNotAvailableException(
+ string engineName,
+ string resolution,
+ string message,
+ string errorIconPath,
+ Func>? action = null) : base(message)
+ {
+ EngineName = engineName;
+ Resolution = resolution;
+ ErrorIcon = errorIconPath;
+ Action = action ?? (_ =>
+ {
+ Clipboard.SetDataObject(this.ToString());
+ return ValueTask.FromResult(true);
+ });
+ }
+
+ public override string ToString()
+ {
+ return $"Engine {EngineName} is not available.\n Try to {Resolution}\n {base.ToString()}";
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/SearchException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/SearchException.cs
new file mode 100644
index 000000000..eef81a921
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Exceptions/SearchException.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Exceptions
+{
+ public class SearchException : Exception
+ {
+ public string EngineName { get; }
+ public SearchException(string engineName, string message) : base(message)
+ {
+ EngineName = engineName;
+ }
+
+ public SearchException(string engineName, string message, Exception innerException) : base(message, innerException)
+ {
+ EngineName = engineName;
+ }
+
+ public override string ToString()
+ {
+ return $"{EngineName} Search Exception:\n {base.ToString()}";
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 8f9466794..1c0bdaad7 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -2,12 +2,13 @@
Library
- net5.0-windows
+ net7.0-windows
true
true
true
false
en
+ warnings
@@ -24,6 +25,12 @@
PreserveNewest
+
+ PreserveNewest
+
+
+ PreserveNewest
+
@@ -38,7 +45,8 @@
-
+
+
@@ -47,5 +55,5 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs
new file mode 100644
index 000000000..3870c4876
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs
@@ -0,0 +1,1615 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Drawing;
+using System.Windows.Forms;
+using System.IO;
+using System.Security.Permissions;
+
+namespace Peter
+{
+ // Code from https://www.codeproject.com/Articles/22012/Explorer-Shell-Context-Menu:
+ ///
+ /// "Stand-alone" shell context menu
+ ///
+ /// It isn't really debugged but is mostly working.
+ /// Create an instance and call ShowContextMenu with a list of FileInfo for the files.
+ /// Limitation is that it only handles files in the same directory but it can be fixed
+ /// by changing the way files are translated into PIDLs.
+ ///
+ /// Based on FileBrowser in C# from CodeProject
+ /// http://www.codeproject.com/useritems/FileBrowser.asp
+ ///
+ /// Hooking class taken from MSDN Magazine Cutting Edge column
+ /// http://msdn.microsoft.com/msdnmag/issues/02/10/CuttingEdge/
+ ///
+ /// Andreas Johansson
+ /// afjohansson@hotmail.com
+ /// http://afjohansson.spaces.live.com
+ ///
+ ///
+ /// ShellContextMenu scm = new ShellContextMenu();
+ /// FileInfo[] files = new FileInfo[1];
+ /// files[0] = new FileInfo(@"c:\windows\notepad.exe");
+ /// scm.ShowContextMenu(this.Handle, files, Cursor.Position);
+ ///
+ public class ShellContextMenu : NativeWindow
+ {
+ #region Constructor
+
+ /// Default constructor
+ public ShellContextMenu()
+ {
+ this.CreateHandle(new CreateParams());
+ }
+
+ #endregion
+
+ #region Destructor
+
+ /// Ensure all resources get released
+ ~ShellContextMenu()
+ {
+ ReleaseAll();
+ }
+
+ #endregion
+
+ #region GetContextMenuInterfaces()
+
+ /// Gets the interfaces to the context menu
+ /// Parent folder
+ /// PIDLs
+ /// true if it got the interfaces, otherwise false
+ private bool GetContextMenuInterfaces(IShellFolder oParentFolder, IntPtr[] arrPIDLs, out IntPtr ctxMenuPtr)
+ {
+ int nResult = oParentFolder.GetUIObjectOf(
+ IntPtr.Zero,
+ (uint)arrPIDLs.Length,
+ arrPIDLs,
+ ref IID_IContextMenu,
+ IntPtr.Zero,
+ out ctxMenuPtr);
+
+ if (S_OK == nResult)
+ {
+ _oContextMenu = (IContextMenu)Marshal.GetTypedObjectForIUnknown(ctxMenuPtr, typeof(IContextMenu));
+
+ return true;
+ }
+ else
+ {
+ ctxMenuPtr = IntPtr.Zero;
+ _oContextMenu = null;
+ return false;
+ }
+ }
+
+ #endregion
+
+ #region Override
+
+ ///
+ /// This method receives WindowMessages. It will make the "Open With" and "Send To" work
+ /// by calling HandleMenuMsg and HandleMenuMsg2. It will also call the OnContextMenuMouseHover
+ /// method of Browser when hovering over a ContextMenu item.
+ ///
+ /// the Message of the Browser's WndProc
+ /// true if the message has been handled, false otherwise
+ protected override void WndProc(ref Message m)
+ {
+ #region IContextMenu
+
+ if (_oContextMenu != null &&
+ m.Msg == (int)WM.MENUSELECT &&
+ (ShellHelper.HiWord(m.WParam) & (nint)MFT.SEPARATOR) == 0 &&
+ (ShellHelper.HiWord(m.WParam) & (nint)MFT.POPUP) == 0)
+ {
+ string info = string.Empty;
+
+ if (ShellHelper.LoWord(m.WParam) == (nint)CMD_CUSTOM.ExpandCollapse)
+ info = "Expands or collapses the current selected item";
+ else
+ {
+ info = "";
+ }
+ }
+
+ #endregion
+
+ #region IContextMenu2
+
+ if (_oContextMenu2 != null &&
+ (m.Msg == (int)WM.INITMENUPOPUP ||
+ m.Msg == (int)WM.MEASUREITEM ||
+ m.Msg == (int)WM.DRAWITEM))
+ {
+ if (_oContextMenu2.HandleMenuMsg(
+ (uint)m.Msg, m.WParam, m.LParam) == S_OK)
+ return;
+ }
+
+ #endregion
+
+ #region IContextMenu3
+
+ if (_oContextMenu3 != null &&
+ m.Msg == (int)WM.MENUCHAR)
+ {
+ if (_oContextMenu3.HandleMenuMsg2(
+ (uint)m.Msg, m.WParam, m.LParam, IntPtr.Zero) == S_OK)
+ return;
+ }
+
+ #endregion
+
+ base.WndProc(ref m);
+ }
+
+ #endregion
+
+ #region InvokeCommand
+
+ private void InvokeCommand(IContextMenu oContextMenu, uint nCmd, string strFolder, Point pointInvoke)
+ {
+ CMINVOKECOMMANDINFOEX invoke = new CMINVOKECOMMANDINFOEX();
+ invoke.cbSize = cbInvokeCommand;
+ invoke.lpVerb = (IntPtr)(nCmd - CMD_FIRST);
+ invoke.lpDirectory = strFolder;
+ invoke.lpVerbW = (IntPtr)(nCmd - CMD_FIRST);
+ invoke.lpDirectoryW = strFolder;
+ invoke.fMask = CMIC.UNICODE | CMIC.PTINVOKE |
+ ((Control.ModifierKeys & Keys.Control) != 0 ? CMIC.CONTROL_DOWN : 0) |
+ ((Control.ModifierKeys & Keys.Shift) != 0 ? CMIC.SHIFT_DOWN : 0);
+ invoke.ptInvoke = new POINT(pointInvoke.X, pointInvoke.Y);
+ invoke.nShow = SW.SHOWNORMAL;
+
+ oContextMenu.InvokeCommand(ref invoke);
+ }
+
+ #endregion
+
+ #region ReleaseAll()
+
+ ///
+ /// Release all allocated interfaces, PIDLs
+ ///
+ private void ReleaseAll()
+ {
+ if (null != _oContextMenu)
+ {
+ Marshal.ReleaseComObject(_oContextMenu);
+ _oContextMenu = null;
+ }
+ if (null != _oContextMenu2)
+ {
+ Marshal.ReleaseComObject(_oContextMenu2);
+ _oContextMenu2 = null;
+ }
+ if (null != _oContextMenu3)
+ {
+ Marshal.ReleaseComObject(_oContextMenu3);
+ _oContextMenu3 = null;
+ }
+ if (null != _oDesktopFolder)
+ {
+ Marshal.ReleaseComObject(_oDesktopFolder);
+ _oDesktopFolder = null;
+ }
+ if (null != _oParentFolder)
+ {
+ Marshal.ReleaseComObject(_oParentFolder);
+ _oParentFolder = null;
+ }
+ if (null != _arrPIDLs)
+ {
+ FreePIDLs(_arrPIDLs);
+ _arrPIDLs = null;
+ }
+ }
+
+ #endregion
+
+ #region GetDesktopFolder()
+
+ ///
+ /// Gets the desktop folder
+ ///
+ /// IShellFolder for desktop folder
+ private IShellFolder GetDesktopFolder()
+ {
+ IntPtr pUnkownDesktopFolder = IntPtr.Zero;
+
+ if (null == _oDesktopFolder)
+ {
+ // Get desktop IShellFolder
+ int nResult = SHGetDesktopFolder(out pUnkownDesktopFolder);
+ if (S_OK != nResult)
+ {
+ throw new ShellContextMenuException("Failed to get the desktop shell folder");
+ }
+ _oDesktopFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(pUnkownDesktopFolder, typeof(IShellFolder));
+ }
+
+ return _oDesktopFolder;
+ }
+
+ #endregion
+
+ #region GetParentFolder()
+
+ ///
+ /// Gets the parent folder
+ ///
+ /// Folder path
+ /// IShellFolder for the folder (relative from the desktop)
+ private IShellFolder GetParentFolder(string folderName)
+ {
+ if (null == _oParentFolder)
+ {
+ IShellFolder oDesktopFolder = GetDesktopFolder();
+ if (null == oDesktopFolder)
+ {
+ return null;
+ }
+
+ // Get the PIDL for the folder file is in
+ IntPtr pPIDL = IntPtr.Zero;
+ uint pchEaten = 0;
+ SFGAO pdwAttributes = 0;
+ int nResult = oDesktopFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, folderName, ref pchEaten, out pPIDL, ref pdwAttributes);
+ if (S_OK != nResult)
+ {
+ return null;
+ }
+
+ IntPtr pStrRet = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4);
+ Marshal.WriteInt32(pStrRet, 0, 0);
+ nResult = _oDesktopFolder.GetDisplayNameOf(pPIDL, SHGNO.FORPARSING, pStrRet);
+ StringBuilder strFolder = new StringBuilder(MAX_PATH);
+ StrRetToBuf(pStrRet, pPIDL, strFolder, MAX_PATH);
+ Marshal.FreeCoTaskMem(pStrRet);
+ pStrRet = IntPtr.Zero;
+ _strParentFolder = strFolder.ToString();
+
+ // Get the IShellFolder for folder
+ IntPtr pUnknownParentFolder = IntPtr.Zero;
+ nResult = oDesktopFolder.BindToObject(pPIDL, IntPtr.Zero, ref IID_IShellFolder, out pUnknownParentFolder);
+ // Free the PIDL first
+ Marshal.FreeCoTaskMem(pPIDL);
+ if (S_OK != nResult)
+ {
+ return null;
+ }
+ _oParentFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(pUnknownParentFolder, typeof(IShellFolder));
+ }
+
+ return _oParentFolder;
+ }
+
+ #endregion
+
+ #region GetPIDLs()
+
+ ///
+ /// Get the PIDLs
+ ///
+ /// Array of FileInfo
+ /// Array of PIDLs
+ protected IntPtr[] GetPIDLs(FileInfo[] arrFI)
+ {
+ if (null == arrFI || 0 == arrFI.Length)
+ {
+ return null;
+ }
+
+ IShellFolder oParentFolder = GetParentFolder(arrFI[0].DirectoryName);
+ if (null == oParentFolder)
+ {
+ return null;
+ }
+
+ IntPtr[] arrPIDLs = new IntPtr[arrFI.Length];
+ int n = 0;
+ foreach (FileInfo fi in arrFI)
+ {
+ // Get the file relative to folder
+ uint pchEaten = 0;
+ SFGAO pdwAttributes = 0;
+ IntPtr pPIDL = IntPtr.Zero;
+ int nResult = oParentFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, fi.Name, ref pchEaten, out pPIDL, ref pdwAttributes);
+ if (S_OK != nResult)
+ {
+ FreePIDLs(arrPIDLs);
+ return null;
+ }
+ arrPIDLs[n] = pPIDL;
+ n++;
+ }
+
+ return arrPIDLs;
+ }
+
+ ///
+ /// Get the PIDLs
+ ///
+ /// Array of DirectoryInfo
+ /// Array of PIDLs
+ protected IntPtr[] GetPIDLs(DirectoryInfo[] arrFI)
+ {
+ if (null == arrFI || 0 == arrFI.Length)
+ {
+ return null;
+ }
+
+ IShellFolder oParentFolder = GetParentFolder(arrFI[0].Parent.FullName);
+ if (null == oParentFolder)
+ {
+ return null;
+ }
+
+ IntPtr[] arrPIDLs = new IntPtr[arrFI.Length];
+ int n = 0;
+ foreach (DirectoryInfo fi in arrFI)
+ {
+ // Get the file relative to folder
+ uint pchEaten = 0;
+ SFGAO pdwAttributes = 0;
+ IntPtr pPIDL = IntPtr.Zero;
+ int nResult = oParentFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, fi.Name, ref pchEaten, out pPIDL, ref pdwAttributes);
+ if (S_OK != nResult)
+ {
+ FreePIDLs(arrPIDLs);
+ return null;
+ }
+ arrPIDLs[n] = pPIDL;
+ n++;
+ }
+
+ return arrPIDLs;
+ }
+
+ #endregion
+
+ #region FreePIDLs()
+
+ ///
+ /// Free the PIDLs
+ ///
+ /// Array of PIDLs (IntPtr)
+ protected void FreePIDLs(IntPtr[] arrPIDLs)
+ {
+ if (null != arrPIDLs)
+ {
+ for (int n = 0; n < arrPIDLs.Length; n++)
+ {
+ if (arrPIDLs[n] != IntPtr.Zero)
+ {
+ Marshal.FreeCoTaskMem(arrPIDLs[n]);
+ arrPIDLs[n] = IntPtr.Zero;
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region InvokeContextMenuDefault
+
+ private void InvokeContextMenuDefault(FileInfo[] arrFI)
+ {
+ // Release all resources first.
+ ReleaseAll();
+
+ IntPtr pMenu = IntPtr.Zero,
+ iContextMenuPtr = IntPtr.Zero;
+
+ try
+ {
+ _arrPIDLs = GetPIDLs(arrFI);
+ if (null == _arrPIDLs)
+ {
+ ReleaseAll();
+ return;
+ }
+
+ if (false == GetContextMenuInterfaces(_oParentFolder, _arrPIDLs, out iContextMenuPtr))
+ {
+ ReleaseAll();
+ return;
+ }
+
+ pMenu = CreatePopupMenu();
+
+ int nResult = _oContextMenu.QueryContextMenu(
+ pMenu,
+ 0,
+ CMD_FIRST,
+ CMD_LAST,
+ CMF.DEFAULTONLY |
+ ((Control.ModifierKeys & Keys.Shift) != 0 ? CMF.EXTENDEDVERBS : 0));
+
+ uint nDefaultCmd = (uint)GetMenuDefaultItem(pMenu, false, 0);
+ if (nDefaultCmd >= CMD_FIRST)
+ {
+ InvokeCommand(_oContextMenu, nDefaultCmd, arrFI[0].DirectoryName, Control.MousePosition);
+ }
+
+ DestroyMenu(pMenu);
+ pMenu = IntPtr.Zero;
+ }
+ catch
+ {
+ throw;
+ }
+ finally
+ {
+ if (pMenu != IntPtr.Zero)
+ {
+ DestroyMenu(pMenu);
+ }
+ ReleaseAll();
+ }
+ }
+
+ #endregion
+
+ #region ShowContextMenu()
+
+ ///
+ /// Shows the context menu
+ ///
+ /// FileInfos (should all be in same directory)
+ /// Where to show the menu
+ public void ShowContextMenu(FileInfo[] files, Point pointScreen)
+ {
+ // Release all resources first.
+ ReleaseAll();
+ _arrPIDLs = GetPIDLs(files);
+ this.ShowContextMenu(pointScreen);
+ }
+
+ ///
+ /// Shows the context menu
+ ///
+ /// DirectoryInfos (should all be in same directory)
+ /// Where to show the menu
+ public void ShowContextMenu(DirectoryInfo[] dirs, Point pointScreen)
+ {
+ // Release all resources first.
+ ReleaseAll();
+ _arrPIDLs = GetPIDLs(dirs);
+ this.ShowContextMenu(pointScreen);
+ }
+
+ ///
+ /// Shows the context menu
+ ///
+ /// FileInfos (should all be in same directory)
+ /// Where to show the menu
+ private void ShowContextMenu(Point pointScreen)
+ {
+ IntPtr pMenu = IntPtr.Zero,
+ iContextMenuPtr = IntPtr.Zero,
+ iContextMenuPtr2 = IntPtr.Zero,
+ iContextMenuPtr3 = IntPtr.Zero;
+
+ try
+ {
+ if (null == _arrPIDLs)
+ {
+ ReleaseAll();
+ return;
+ }
+
+ if (false == GetContextMenuInterfaces(_oParentFolder, _arrPIDLs, out iContextMenuPtr))
+ {
+ ReleaseAll();
+ return;
+ }
+
+ pMenu = CreatePopupMenu();
+
+ int nResult = _oContextMenu.QueryContextMenu(
+ pMenu,
+ 0,
+ CMD_FIRST,
+ CMD_LAST,
+ CMF.EXPLORE |
+ CMF.NORMAL |
+ ((Control.ModifierKeys & Keys.Shift) != 0 ? CMF.EXTENDEDVERBS : 0));
+
+ Marshal.QueryInterface(iContextMenuPtr, ref IID_IContextMenu2, out iContextMenuPtr2);
+ Marshal.QueryInterface(iContextMenuPtr, ref IID_IContextMenu3, out iContextMenuPtr3);
+
+ _oContextMenu2 = (IContextMenu2)Marshal.GetTypedObjectForIUnknown(iContextMenuPtr2, typeof(IContextMenu2));
+ _oContextMenu3 = (IContextMenu3)Marshal.GetTypedObjectForIUnknown(iContextMenuPtr3, typeof(IContextMenu3));
+
+ uint nSelected = TrackPopupMenuEx(
+ pMenu,
+ TPM.RETURNCMD,
+ pointScreen.X,
+ pointScreen.Y,
+ this.Handle,
+ IntPtr.Zero);
+
+ DestroyMenu(pMenu);
+ pMenu = IntPtr.Zero;
+
+ if (nSelected != 0)
+ {
+ InvokeCommand(_oContextMenu, nSelected, _strParentFolder, pointScreen);
+ }
+ }
+ catch
+ {
+ throw;
+ }
+ finally
+ {
+ //hook.Uninstall();
+ if (pMenu != IntPtr.Zero)
+ {
+ DestroyMenu(pMenu);
+ }
+
+ if (iContextMenuPtr != IntPtr.Zero)
+ Marshal.Release(iContextMenuPtr);
+
+ if (iContextMenuPtr2 != IntPtr.Zero)
+ Marshal.Release(iContextMenuPtr2);
+
+ if (iContextMenuPtr3 != IntPtr.Zero)
+ Marshal.Release(iContextMenuPtr3);
+
+ ReleaseAll();
+ }
+ }
+
+ #endregion
+
+ #region Local variabled
+
+ private IContextMenu _oContextMenu;
+ private IContextMenu2 _oContextMenu2;
+ private IContextMenu3 _oContextMenu3;
+ private IShellFolder _oDesktopFolder;
+ private IShellFolder _oParentFolder;
+ private IntPtr[] _arrPIDLs;
+ private string _strParentFolder;
+
+ #endregion
+
+ #region Variables and Constants
+
+ private const int MAX_PATH = 260;
+ private const uint CMD_FIRST = 1;
+ private const uint CMD_LAST = 30000;
+
+ private const int S_OK = 0;
+ private const int S_FALSE = 1;
+
+ private static int cbMenuItemInfo = Marshal.SizeOf(typeof(MENUITEMINFO));
+ private static int cbInvokeCommand = Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX));
+
+ #endregion
+
+ #region DLL Import
+
+ // Retrieves the IShellFolder interface for the desktop folder, which is the root of the Shell's namespace.
+ [DllImport("shell32.dll")]
+ private static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);
+
+ // Takes a STRRET structure returned by IShellFolder::GetDisplayNameOf, converts it to a string, and places the result in a buffer.
+ [DllImport("shlwapi.dll", EntryPoint = "StrRetToBuf", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
+ private static extern Int32 StrRetToBuf(IntPtr pstr, IntPtr pidl, StringBuilder pszBuf, int cchBuf);
+
+ // The TrackPopupMenuEx function displays a shortcut menu at the specified location and tracks the selection of items on the shortcut menu. The shortcut menu can appear anywhere on the screen.
+ [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
+ private static extern uint TrackPopupMenuEx(IntPtr hmenu, TPM flags, int x, int y, IntPtr hwnd, IntPtr lptpm);
+
+ // The CreatePopupMenu function creates a drop-down menu, submenu, or shortcut menu. The menu is initially empty. You can insert or append menu items by using the InsertMenuItem function. You can also use the InsertMenu function to insert menu items and the AppendMenu function to append menu items.
+ [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
+ private static extern IntPtr CreatePopupMenu();
+
+ // The DestroyMenu function destroys the specified menu and frees any memory that the menu occupies.
+ [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
+ private static extern bool DestroyMenu(IntPtr hMenu);
+
+ // Determines the default menu item on the specified menu
+ [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
+ private static extern int GetMenuDefaultItem(IntPtr hMenu, bool fByPos, uint gmdiFlags);
+
+ #endregion
+
+ #region Shell GUIDs
+
+ private static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}");
+ private static Guid IID_IContextMenu = new Guid("{000214e4-0000-0000-c000-000000000046}");
+ private static Guid IID_IContextMenu2 = new Guid("{000214f4-0000-0000-c000-000000000046}");
+ private static Guid IID_IContextMenu3 = new Guid("{bcfce0a0-ec17-11d0-8d10-00a0c90f2719}");
+
+ #endregion
+
+ #region Structs
+
+ [StructLayout(LayoutKind.Sequential)]
+ private struct CWPSTRUCT
+ {
+ public IntPtr lparam;
+ public IntPtr wparam;
+ public int message;
+ public IntPtr hwnd;
+ }
+
+ // Contains extended information about a shortcut menu command
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ private struct CMINVOKECOMMANDINFOEX
+ {
+ public int cbSize;
+ public CMIC fMask;
+ public IntPtr hwnd;
+ public IntPtr lpVerb;
+ [MarshalAs(UnmanagedType.LPStr)]
+ public string lpParameters;
+ [MarshalAs(UnmanagedType.LPStr)]
+ public string lpDirectory;
+ public SW nShow;
+ public int dwHotKey;
+ public IntPtr hIcon;
+ [MarshalAs(UnmanagedType.LPStr)]
+ public string lpTitle;
+ public IntPtr lpVerbW;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string lpParametersW;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string lpDirectoryW;
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string lpTitleW;
+ public POINT ptInvoke;
+ }
+
+ // Contains information about a menu item
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
+ private struct MENUITEMINFO
+ {
+ public MENUITEMINFO(string text)
+ {
+ cbSize = cbMenuItemInfo;
+ dwTypeData = text;
+ cch = text.Length;
+ fMask = 0;
+ fType = 0;
+ fState = 0;
+ wID = 0;
+ hSubMenu = IntPtr.Zero;
+ hbmpChecked = IntPtr.Zero;
+ hbmpUnchecked = IntPtr.Zero;
+ dwItemData = IntPtr.Zero;
+ hbmpItem = IntPtr.Zero;
+ }
+
+ public int cbSize;
+ public MIIM fMask;
+ public MFT fType;
+ public MFS fState;
+ public uint wID;
+ public IntPtr hSubMenu;
+ public IntPtr hbmpChecked;
+ public IntPtr hbmpUnchecked;
+ public IntPtr dwItemData;
+ [MarshalAs(UnmanagedType.LPTStr)]
+ public string dwTypeData;
+ public int cch;
+ public IntPtr hbmpItem;
+ }
+
+ // A generalized global memory handle used for data transfer operations by the
+ // IAdviseSink, IDataObject, and IOleCache interfaces
+ [StructLayout(LayoutKind.Sequential)]
+ private struct STGMEDIUM
+ {
+ public TYMED tymed;
+ public IntPtr hBitmap;
+ public IntPtr hMetaFilePict;
+ public IntPtr hEnhMetaFile;
+ public IntPtr hGlobal;
+ public IntPtr lpszFileName;
+ public IntPtr pstm;
+ public IntPtr pstg;
+ public IntPtr pUnkForRelease;
+ }
+
+ // Defines the x- and y-coordinates of a point
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
+ private struct POINT
+ {
+ public POINT(int x, int y)
+ {
+ this.x = x;
+ this.y = y;
+ }
+
+ public int x;
+ public int y;
+ }
+
+ #endregion
+
+ #region Enums
+
+ // Defines the values used with the IShellFolder::GetDisplayNameOf and IShellFolder::SetNameOf
+ // methods to specify the type of file or folder names used by those methods
+ [Flags]
+ private enum SHGNO
+ {
+ NORMAL = 0x0000,
+ INFOLDER = 0x0001,
+ FOREDITING = 0x1000,
+ FORADDRESSBAR = 0x4000,
+ FORPARSING = 0x8000
+ }
+
+ // The attributes that the caller is requesting, when calling IShellFolder::GetAttributesOf
+ [Flags]
+ private enum SFGAO : uint
+ {
+ BROWSABLE = 0x8000000,
+ CANCOPY = 1,
+ CANDELETE = 0x20,
+ CANLINK = 4,
+ CANMONIKER = 0x400000,
+ CANMOVE = 2,
+ CANRENAME = 0x10,
+ CAPABILITYMASK = 0x177,
+ COMPRESSED = 0x4000000,
+ CONTENTSMASK = 0x80000000,
+ DISPLAYATTRMASK = 0xfc000,
+ DROPTARGET = 0x100,
+ ENCRYPTED = 0x2000,
+ FILESYSANCESTOR = 0x10000000,
+ FILESYSTEM = 0x40000000,
+ FOLDER = 0x20000000,
+ GHOSTED = 0x8000,
+ HASPROPSHEET = 0x40,
+ HASSTORAGE = 0x400000,
+ HASSUBFOLDER = 0x80000000,
+ HIDDEN = 0x80000,
+ ISSLOW = 0x4000,
+ LINK = 0x10000,
+ NEWCONTENT = 0x200000,
+ NONENUMERATED = 0x100000,
+ READONLY = 0x40000,
+ REMOVABLE = 0x2000000,
+ SHARE = 0x20000,
+ STORAGE = 8,
+ STORAGEANCESTOR = 0x800000,
+ STORAGECAPMASK = 0x70c50008,
+ STREAM = 0x400000,
+ VALIDATE = 0x1000000
+ }
+
+ // Determines the type of items included in an enumeration.
+ // These values are used with the IShellFolder::EnumObjects method
+ [Flags]
+ private enum SHCONTF
+ {
+ FOLDERS = 0x0020,
+ NONFOLDERS = 0x0040,
+ INCLUDEHIDDEN = 0x0080,
+ INIT_ON_FIRST_NEXT = 0x0100,
+ NETPRINTERSRCH = 0x0200,
+ SHAREABLE = 0x0400,
+ STORAGE = 0x0800,
+ }
+
+ // Specifies how the shortcut menu can be changed when calling IContextMenu::QueryContextMenu
+ [Flags]
+ private enum CMF : uint
+ {
+ NORMAL = 0x00000000,
+ DEFAULTONLY = 0x00000001,
+ VERBSONLY = 0x00000002,
+ EXPLORE = 0x00000004,
+ NOVERBS = 0x00000008,
+ CANRENAME = 0x00000010,
+ NODEFAULT = 0x00000020,
+ INCLUDESTATIC = 0x00000040,
+ EXTENDEDVERBS = 0x00000100,
+ RESERVED = 0xffff0000
+ }
+
+ // Flags specifying the information to return when calling IContextMenu::GetCommandString
+ [Flags]
+ private enum GCS : uint
+ {
+ VERBA = 0,
+ HELPTEXTA = 1,
+ VALIDATEA = 2,
+ VERBW = 4,
+ HELPTEXTW = 5,
+ VALIDATEW = 6
+ }
+
+ // Specifies how TrackPopupMenuEx positions the shortcut menu horizontally
+ [Flags]
+ private enum TPM : uint
+ {
+ LEFTBUTTON = 0x0000,
+ RIGHTBUTTON = 0x0002,
+ LEFTALIGN = 0x0000,
+ CENTERALIGN = 0x0004,
+ RIGHTALIGN = 0x0008,
+ TOPALIGN = 0x0000,
+ VCENTERALIGN = 0x0010,
+ BOTTOMALIGN = 0x0020,
+ HORIZONTAL = 0x0000,
+ VERTICAL = 0x0040,
+ NONOTIFY = 0x0080,
+ RETURNCMD = 0x0100,
+ RECURSE = 0x0001,
+ HORPOSANIMATION = 0x0400,
+ HORNEGANIMATION = 0x0800,
+ VERPOSANIMATION = 0x1000,
+ VERNEGANIMATION = 0x2000,
+ NOANIMATION = 0x4000,
+ LAYOUTRTL = 0x8000
+ }
+
+ // The cmd for a custom added menu item
+ private enum CMD_CUSTOM
+ {
+ ExpandCollapse = (int)CMD_LAST + 1
+ }
+
+ // Flags used with the CMINVOKECOMMANDINFOEX structure
+ [Flags]
+ private enum CMIC : uint
+ {
+ HOTKEY = 0x00000020,
+ ICON = 0x00000010,
+ FLAG_NO_UI = 0x00000400,
+ UNICODE = 0x00004000,
+ NO_CONSOLE = 0x00008000,
+ ASYNCOK = 0x00100000,
+ NOZONECHECKS = 0x00800000,
+ SHIFT_DOWN = 0x10000000,
+ CONTROL_DOWN = 0x40000000,
+ FLAG_LOG_USAGE = 0x04000000,
+ PTINVOKE = 0x20000000
+ }
+
+ // Specifies how the window is to be shown
+ [Flags]
+ private enum SW
+ {
+ HIDE = 0,
+ SHOWNORMAL = 1,
+ NORMAL = 1,
+ SHOWMINIMIZED = 2,
+ SHOWMAXIMIZED = 3,
+ MAXIMIZE = 3,
+ SHOWNOACTIVATE = 4,
+ SHOW = 5,
+ MINIMIZE = 6,
+ SHOWMINNOACTIVE = 7,
+ SHOWNA = 8,
+ RESTORE = 9,
+ SHOWDEFAULT = 10,
+ }
+
+ // Window message flags
+ [Flags]
+ private enum WM : uint
+ {
+ ACTIVATE = 0x6,
+ ACTIVATEAPP = 0x1C,
+ AFXFIRST = 0x360,
+ AFXLAST = 0x37F,
+ APP = 0x8000,
+ ASKCBFORMATNAME = 0x30C,
+ CANCELJOURNAL = 0x4B,
+ CANCELMODE = 0x1F,
+ CAPTURECHANGED = 0x215,
+ CHANGECBCHAIN = 0x30D,
+ CHAR = 0x102,
+ CHARTOITEM = 0x2F,
+ CHILDACTIVATE = 0x22,
+ CLEAR = 0x303,
+ CLOSE = 0x10,
+ COMMAND = 0x111,
+ COMPACTING = 0x41,
+ COMPAREITEM = 0x39,
+ CONTEXTMENU = 0x7B,
+ COPY = 0x301,
+ COPYDATA = 0x4A,
+ CREATE = 0x1,
+ CTLCOLORBTN = 0x135,
+ CTLCOLORDLG = 0x136,
+ CTLCOLOREDIT = 0x133,
+ CTLCOLORLISTBOX = 0x134,
+ CTLCOLORMSGBOX = 0x132,
+ CTLCOLORSCROLLBAR = 0x137,
+ CTLCOLORSTATIC = 0x138,
+ CUT = 0x300,
+ DEADCHAR = 0x103,
+ DELETEITEM = 0x2D,
+ DESTROY = 0x2,
+ DESTROYCLIPBOARD = 0x307,
+ DEVICECHANGE = 0x219,
+ DEVMODECHANGE = 0x1B,
+ DISPLAYCHANGE = 0x7E,
+ DRAWCLIPBOARD = 0x308,
+ DRAWITEM = 0x2B,
+ DROPFILES = 0x233,
+ ENABLE = 0xA,
+ ENDSESSION = 0x16,
+ ENTERIDLE = 0x121,
+ ENTERMENULOOP = 0x211,
+ ENTERSIZEMOVE = 0x231,
+ ERASEBKGND = 0x14,
+ EXITMENULOOP = 0x212,
+ EXITSIZEMOVE = 0x232,
+ FONTCHANGE = 0x1D,
+ GETDLGCODE = 0x87,
+ GETFONT = 0x31,
+ GETHOTKEY = 0x33,
+ GETICON = 0x7F,
+ GETMINMAXINFO = 0x24,
+ GETOBJECT = 0x3D,
+ GETSYSMENU = 0x313,
+ GETTEXT = 0xD,
+ GETTEXTLENGTH = 0xE,
+ HANDHELDFIRST = 0x358,
+ HANDHELDLAST = 0x35F,
+ HELP = 0x53,
+ HOTKEY = 0x312,
+ HSCROLL = 0x114,
+ HSCROLLCLIPBOARD = 0x30E,
+ ICONERASEBKGND = 0x27,
+ IME_CHAR = 0x286,
+ IME_COMPOSITION = 0x10F,
+ IME_COMPOSITIONFULL = 0x284,
+ IME_CONTROL = 0x283,
+ IME_ENDCOMPOSITION = 0x10E,
+ IME_KEYDOWN = 0x290,
+ IME_KEYLAST = 0x10F,
+ IME_KEYUP = 0x291,
+ IME_NOTIFY = 0x282,
+ IME_REQUEST = 0x288,
+ IME_SELECT = 0x285,
+ IME_SETCONTEXT = 0x281,
+ IME_STARTCOMPOSITION = 0x10D,
+ INITDIALOG = 0x110,
+ INITMENU = 0x116,
+ INITMENUPOPUP = 0x117,
+ INPUTLANGCHANGE = 0x51,
+ INPUTLANGCHANGEREQUEST = 0x50,
+ KEYDOWN = 0x100,
+ KEYFIRST = 0x100,
+ KEYLAST = 0x108,
+ KEYUP = 0x101,
+ KILLFOCUS = 0x8,
+ LBUTTONDBLCLK = 0x203,
+ LBUTTONDOWN = 0x201,
+ LBUTTONUP = 0x202,
+ LVM_GETEDITCONTROL = 0x1018,
+ LVM_SETIMAGELIST = 0x1003,
+ MBUTTONDBLCLK = 0x209,
+ MBUTTONDOWN = 0x207,
+ MBUTTONUP = 0x208,
+ MDIACTIVATE = 0x222,
+ MDICASCADE = 0x227,
+ MDICREATE = 0x220,
+ MDIDESTROY = 0x221,
+ MDIGETACTIVE = 0x229,
+ MDIICONARRANGE = 0x228,
+ MDIMAXIMIZE = 0x225,
+ MDINEXT = 0x224,
+ MDIREFRESHMENU = 0x234,
+ MDIRESTORE = 0x223,
+ MDISETMENU = 0x230,
+ MDITILE = 0x226,
+ MEASUREITEM = 0x2C,
+ MENUCHAR = 0x120,
+ MENUCOMMAND = 0x126,
+ MENUDRAG = 0x123,
+ MENUGETOBJECT = 0x124,
+ MENURBUTTONUP = 0x122,
+ MENUSELECT = 0x11F,
+ MOUSEACTIVATE = 0x21,
+ MOUSEFIRST = 0x200,
+ MOUSEHOVER = 0x2A1,
+ MOUSELAST = 0x20A,
+ MOUSELEAVE = 0x2A3,
+ MOUSEMOVE = 0x200,
+ MOUSEWHEEL = 0x20A,
+ MOVE = 0x3,
+ MOVING = 0x216,
+ NCACTIVATE = 0x86,
+ NCCALCSIZE = 0x83,
+ NCCREATE = 0x81,
+ NCDESTROY = 0x82,
+ NCHITTEST = 0x84,
+ NCLBUTTONDBLCLK = 0xA3,
+ NCLBUTTONDOWN = 0xA1,
+ NCLBUTTONUP = 0xA2,
+ NCMBUTTONDBLCLK = 0xA9,
+ NCMBUTTONDOWN = 0xA7,
+ NCMBUTTONUP = 0xA8,
+ NCMOUSEHOVER = 0x2A0,
+ NCMOUSELEAVE = 0x2A2,
+ NCMOUSEMOVE = 0xA0,
+ NCPAINT = 0x85,
+ NCRBUTTONDBLCLK = 0xA6,
+ NCRBUTTONDOWN = 0xA4,
+ NCRBUTTONUP = 0xA5,
+ NEXTDLGCTL = 0x28,
+ NEXTMENU = 0x213,
+ NOTIFY = 0x4E,
+ NOTIFYFORMAT = 0x55,
+ NULL = 0x0,
+ PAINT = 0xF,
+ PAINTCLIPBOARD = 0x309,
+ PAINTICON = 0x26,
+ PALETTECHANGED = 0x311,
+ PALETTEISCHANGING = 0x310,
+ PARENTNOTIFY = 0x210,
+ PASTE = 0x302,
+ PENWINFIRST = 0x380,
+ PENWINLAST = 0x38F,
+ POWER = 0x48,
+ PRINT = 0x317,
+ PRINTCLIENT = 0x318,
+ QUERYDRAGICON = 0x37,
+ QUERYENDSESSION = 0x11,
+ QUERYNEWPALETTE = 0x30F,
+ QUERYOPEN = 0x13,
+ QUEUESYNC = 0x23,
+ QUIT = 0x12,
+ RBUTTONDBLCLK = 0x206,
+ RBUTTONDOWN = 0x204,
+ RBUTTONUP = 0x205,
+ RENDERALLFORMATS = 0x306,
+ RENDERFORMAT = 0x305,
+ SETCURSOR = 0x20,
+ SETFOCUS = 0x7,
+ SETFONT = 0x30,
+ SETHOTKEY = 0x32,
+ SETICON = 0x80,
+ SETMARGINS = 0xD3,
+ SETREDRAW = 0xB,
+ SETTEXT = 0xC,
+ SETTINGCHANGE = 0x1A,
+ SHOWWINDOW = 0x18,
+ SIZE = 0x5,
+ SIZECLIPBOARD = 0x30B,
+ SIZING = 0x214,
+ SPOOLERSTATUS = 0x2A,
+ STYLECHANGED = 0x7D,
+ STYLECHANGING = 0x7C,
+ SYNCPAINT = 0x88,
+ SYSCHAR = 0x106,
+ SYSCOLORCHANGE = 0x15,
+ SYSCOMMAND = 0x112,
+ SYSDEADCHAR = 0x107,
+ SYSKEYDOWN = 0x104,
+ SYSKEYUP = 0x105,
+ TCARD = 0x52,
+ TIMECHANGE = 0x1E,
+ TIMER = 0x113,
+ TVM_GETEDITCONTROL = 0x110F,
+ TVM_SETIMAGELIST = 0x1109,
+ UNDO = 0x304,
+ UNINITMENUPOPUP = 0x125,
+ USER = 0x400,
+ USERCHANGED = 0x54,
+ VKEYTOITEM = 0x2E,
+ VSCROLL = 0x115,
+ VSCROLLCLIPBOARD = 0x30A,
+ WINDOWPOSCHANGED = 0x47,
+ WINDOWPOSCHANGING = 0x46,
+ WININICHANGE = 0x1A,
+ SH_NOTIFY = 0x0401
+ }
+
+ // Specifies the content of the new menu item
+ [Flags]
+ private enum MFT : uint
+ {
+ GRAYED = 0x00000003,
+ DISABLED = 0x00000003,
+ CHECKED = 0x00000008,
+ SEPARATOR = 0x00000800,
+ RADIOCHECK = 0x00000200,
+ BITMAP = 0x00000004,
+ OWNERDRAW = 0x00000100,
+ MENUBARBREAK = 0x00000020,
+ MENUBREAK = 0x00000040,
+ RIGHTORDER = 0x00002000,
+ BYCOMMAND = 0x00000000,
+ BYPOSITION = 0x00000400,
+ POPUP = 0x00000010
+ }
+
+ // Specifies the state of the new menu item
+ [Flags]
+ private enum MFS : uint
+ {
+ GRAYED = 0x00000003,
+ DISABLED = 0x00000003,
+ CHECKED = 0x00000008,
+ HILITE = 0x00000080,
+ ENABLED = 0x00000000,
+ UNCHECKED = 0x00000000,
+ UNHILITE = 0x00000000,
+ DEFAULT = 0x00001000
+ }
+
+ // Specifies the content of the new menu item
+ [Flags]
+ private enum MIIM : uint
+ {
+ BITMAP = 0x80,
+ CHECKMARKS = 0x08,
+ DATA = 0x20,
+ FTYPE = 0x100,
+ ID = 0x02,
+ STATE = 0x01,
+ STRING = 0x40,
+ SUBMENU = 0x04,
+ TYPE = 0x10
+ }
+
+ // Indicates the type of storage medium being used in a data transfer
+ [Flags]
+ private enum TYMED
+ {
+ ENHMF = 0x40,
+ FILE = 2,
+ GDI = 0x10,
+ HGLOBAL = 1,
+ ISTORAGE = 8,
+ ISTREAM = 4,
+ MFPICT = 0x20,
+ NULL = 0
+ }
+
+ #endregion
+
+ #region IShellFolder
+
+ [ComImport]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [Guid("000214E6-0000-0000-C000-000000000046")]
+ private interface IShellFolder
+ {
+ // Translates a file object's or folder's display name into an item identifier list.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 ParseDisplayName(
+ IntPtr hwnd,
+ IntPtr pbc,
+ [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
+ ref uint pchEaten,
+ out IntPtr ppidl,
+ ref SFGAO pdwAttributes);
+
+ // Allows a client to determine the contents of a folder by creating an item
+ // identifier enumeration object and returning its IEnumIDList interface.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 EnumObjects(
+ IntPtr hwnd,
+ SHCONTF grfFlags,
+ out IntPtr enumIDList);
+
+ // Retrieves an IShellFolder object for a subfolder.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 BindToObject(
+ IntPtr pidl,
+ IntPtr pbc,
+ ref Guid riid,
+ out IntPtr ppv);
+
+ // Requests a pointer to an object's storage interface.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 BindToStorage(
+ IntPtr pidl,
+ IntPtr pbc,
+ ref Guid riid,
+ out IntPtr ppv);
+
+ // Determines the relative order of two file objects or folders, given their
+ // item identifier lists. Return value: If this method is successful, the
+ // CODE field of the HRESULT contains one of the following values (the code
+ // can be retrived using the helper function GetHResultCode): Negative A
+ // negative return value indicates that the first item should precede
+ // the second (pidl1 < pidl2).
+
+ // Positive A positive return value indicates that the first item should
+ // follow the second (pidl1 > pidl2). Zero A return value of zero
+ // indicates that the two items are the same (pidl1 = pidl2).
+ [PreserveSig]
+ Int32 CompareIDs(
+ IntPtr lParam,
+ IntPtr pidl1,
+ IntPtr pidl2);
+
+ // Requests an object that can be used to obtain information from or interact
+ // with a folder object.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 CreateViewObject(
+ IntPtr hwndOwner,
+ Guid riid,
+ out IntPtr ppv);
+
+ // Retrieves the attributes of one or more file objects or subfolders.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 GetAttributesOf(
+ uint cidl,
+ [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
+ ref SFGAO rgfInOut);
+
+ // Retrieves an OLE interface that can be used to carry out actions on the
+ // specified file objects or folders.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 GetUIObjectOf(
+ IntPtr hwndOwner,
+ uint cidl,
+ [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
+ ref Guid riid,
+ IntPtr rgfReserved,
+ out IntPtr ppv);
+
+ // Retrieves the display name for the specified file object or subfolder.
+ // Return value: error code, if any
+ [PreserveSig()]
+ Int32 GetDisplayNameOf(
+ IntPtr pidl,
+ SHGNO uFlags,
+ IntPtr lpName);
+
+ // Sets the display name of a file object or subfolder, changing the item
+ // identifier in the process.
+ // Return value: error code, if any
+ [PreserveSig]
+ Int32 SetNameOf(
+ IntPtr hwnd,
+ IntPtr pidl,
+ [MarshalAs(UnmanagedType.LPWStr)] string pszName,
+ SHGNO uFlags,
+ out IntPtr ppidlOut);
+ }
+
+ #endregion
+
+ #region IContextMenu
+
+ [ComImport()]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [GuidAttribute("000214e4-0000-0000-c000-000000000046")]
+ private interface IContextMenu
+ {
+ // Adds commands to a shortcut menu
+ [PreserveSig()]
+ Int32 QueryContextMenu(
+ IntPtr hmenu,
+ uint iMenu,
+ uint idCmdFirst,
+ uint idCmdLast,
+ CMF uFlags);
+
+ // Carries out the command associated with a shortcut menu item
+ [PreserveSig()]
+ Int32 InvokeCommand(
+ ref CMINVOKECOMMANDINFOEX info);
+
+ // Retrieves information about a shortcut menu command,
+ // including the help string and the language-independent,
+ // or canonical, name for the command
+ [PreserveSig()]
+ Int32 GetCommandString(
+ uint idcmd,
+ GCS uflags,
+ uint reserved,
+ [MarshalAs(UnmanagedType.LPArray)] byte[] commandstring,
+ int cch);
+ }
+
+ [ComImport, Guid("000214f4-0000-0000-c000-000000000046")]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ private interface IContextMenu2
+ {
+ // Adds commands to a shortcut menu
+ [PreserveSig()]
+ Int32 QueryContextMenu(
+ IntPtr hmenu,
+ uint iMenu,
+ uint idCmdFirst,
+ uint idCmdLast,
+ CMF uFlags);
+
+ // Carries out the command associated with a shortcut menu item
+ [PreserveSig()]
+ Int32 InvokeCommand(
+ ref CMINVOKECOMMANDINFOEX info);
+
+ // Retrieves information about a shortcut menu command,
+ // including the help string and the language-independent,
+ // or canonical, name for the command
+ [PreserveSig()]
+ Int32 GetCommandString(
+ uint idcmd,
+ GCS uflags,
+ uint reserved,
+ [MarshalAs(UnmanagedType.LPWStr)] StringBuilder commandstring,
+ int cch);
+
+ // Allows client objects of the IContextMenu interface to
+ // handle messages associated with owner-drawn menu items
+ [PreserveSig]
+ Int32 HandleMenuMsg(
+ uint uMsg,
+ IntPtr wParam,
+ IntPtr lParam);
+ }
+
+ [ComImport, Guid("bcfce0a0-ec17-11d0-8d10-00a0c90f2719")]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ private interface IContextMenu3
+ {
+ // Adds commands to a shortcut menu
+ [PreserveSig()]
+ Int32 QueryContextMenu(
+ IntPtr hmenu,
+ uint iMenu,
+ uint idCmdFirst,
+ uint idCmdLast,
+ CMF uFlags);
+
+ // Carries out the command associated with a shortcut menu item
+ [PreserveSig()]
+ Int32 InvokeCommand(
+ ref CMINVOKECOMMANDINFOEX info);
+
+ // Retrieves information about a shortcut menu command,
+ // including the help string and the language-independent,
+ // or canonical, name for the command
+ [PreserveSig()]
+ Int32 GetCommandString(
+ uint idcmd,
+ GCS uflags,
+ uint reserved,
+ [MarshalAs(UnmanagedType.LPWStr)] StringBuilder commandstring,
+ int cch);
+
+ // Allows client objects of the IContextMenu interface to
+ // handle messages associated with owner-drawn menu items
+ [PreserveSig]
+ Int32 HandleMenuMsg(
+ uint uMsg,
+ IntPtr wParam,
+ IntPtr lParam);
+
+ // Allows client objects of the IContextMenu3 interface to
+ // handle messages associated with owner-drawn menu items
+ [PreserveSig]
+ Int32 HandleMenuMsg2(
+ uint uMsg,
+ IntPtr wParam,
+ IntPtr lParam,
+ IntPtr plResult);
+ }
+
+ #endregion
+ }
+
+ #region ShellContextMenuException
+
+ public class ShellContextMenuException : Exception
+ {
+ /// Default contructor
+ public ShellContextMenuException()
+ {
+ }
+
+ /// Constructor with message
+ /// Message
+ public ShellContextMenuException(string message)
+ : base(message)
+ {
+ }
+ }
+
+ #endregion
+
+ #region Class HookEventArgs
+
+ public class HookEventArgs : EventArgs
+ {
+ public int HookCode; // Hook code
+ public IntPtr wParam; // WPARAM argument
+ public IntPtr lParam; // LPARAM argument
+ }
+
+ #endregion
+
+ #region Enum HookType
+
+ // Hook Types
+ public enum HookType : int
+ {
+ WH_JOURNALRECORD = 0,
+ WH_JOURNALPLAYBACK = 1,
+ WH_KEYBOARD = 2,
+ WH_GETMESSAGE = 3,
+ WH_CALLWNDPROC = 4,
+ WH_CBT = 5,
+ WH_SYSMSGFILTER = 6,
+ WH_MOUSE = 7,
+ WH_HARDWARE = 8,
+ WH_DEBUG = 9,
+ WH_SHELL = 10,
+ WH_FOREGROUNDIDLE = 11,
+ WH_CALLWNDPROCRET = 12,
+ WH_KEYBOARD_LL = 13,
+ WH_MOUSE_LL = 14
+ }
+
+ #endregion
+
+ #region Class LocalWindowsHook
+
+ public class LocalWindowsHook
+ {
+ // ************************************************************************
+ // Filter function delegate
+ public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
+ // ************************************************************************
+
+ // ************************************************************************
+ // Internal properties
+ protected IntPtr m_hhook = IntPtr.Zero;
+ protected HookProc m_filterFunc = null;
+ protected HookType m_hookType;
+ // ************************************************************************
+
+ // ************************************************************************
+ // Event delegate
+ public delegate void HookEventHandler(object sender, HookEventArgs e);
+ // ************************************************************************
+
+ // ************************************************************************
+ // Event: HookInvoked
+ public event HookEventHandler HookInvoked;
+ protected void OnHookInvoked(HookEventArgs e)
+ {
+ if (HookInvoked != null)
+ HookInvoked(this, e);
+ }
+ // ************************************************************************
+
+ // ************************************************************************
+ // Class constructor(s)
+ public LocalWindowsHook(HookType hook)
+ {
+ m_hookType = hook;
+ m_filterFunc = new HookProc(this.CoreHookProc);
+ }
+ public LocalWindowsHook(HookType hook, HookProc func)
+ {
+ m_hookType = hook;
+ m_filterFunc = func;
+ }
+ // ************************************************************************
+
+ // ************************************************************************
+ // Default filter function
+ protected int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)
+ {
+ if (code < 0)
+ return CallNextHookEx(m_hhook, code, wParam, lParam);
+
+ // Let clients determine what to do
+ HookEventArgs e = new HookEventArgs();
+ e.HookCode = code;
+ e.wParam = wParam;
+ e.lParam = lParam;
+ OnHookInvoked(e);
+
+ // Yield to the next hook in the chain
+ return CallNextHookEx(m_hhook, code, wParam, lParam);
+ }
+ // ************************************************************************
+
+ // ************************************************************************
+ // Install the hook
+ public void Install()
+ {
+ m_hhook = SetWindowsHookEx(
+ m_hookType,
+ m_filterFunc,
+ IntPtr.Zero,
+ (int)AppDomain.GetCurrentThreadId());
+ }
+ // ************************************************************************
+
+ // ************************************************************************
+ // Uninstall the hook
+ public void Uninstall()
+ {
+ UnhookWindowsHookEx(m_hhook);
+ }
+ // ************************************************************************
+
+
+ #region Win32 Imports
+
+ // ************************************************************************
+ // Win32: SetWindowsHookEx()
+ [DllImport("user32.dll")]
+ protected static extern IntPtr SetWindowsHookEx(HookType code,
+ HookProc func,
+ IntPtr hInstance,
+ int threadID);
+ // ************************************************************************
+
+ // ************************************************************************
+ // Win32: UnhookWindowsHookEx()
+ [DllImport("user32.dll")]
+ protected static extern int UnhookWindowsHookEx(IntPtr hhook);
+ // ************************************************************************
+
+ // ************************************************************************
+ // Win32: CallNextHookEx()
+ [DllImport("user32.dll")]
+ protected static extern int CallNextHookEx(IntPtr hhook,
+ int code, IntPtr wParam, IntPtr lParam);
+ // ************************************************************************
+
+ #endregion
+ }
+
+ #endregion
+
+ #region ShellHelper
+
+ internal static class ShellHelper
+ {
+ #region Low/High Word
+
+ ///
+ /// Retrieves the High Word of a WParam of a WindowMessage
+ ///
+ /// The pointer to the WParam
+ /// The unsigned integer for the High Word
+ public static nint HiWord(IntPtr ptr)
+ {
+ if (((nint)ptr & 0x80000000) == 0x80000000)
+ return ((nint)ptr >> 16);
+ else
+ return (((nint)ptr >> 16) & 0xffff);
+ }
+
+ ///
+ /// Retrieves the Low Word of a WParam of a WindowMessage
+ ///
+ /// The pointer to the WParam
+ /// The unsigned integer for the Low Word
+ public static nint LoWord(IntPtr ptr)
+ {
+ return (nint)ptr & 0xffff;
+ }
+
+ #endregion
+ }
+
+ #endregion
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
new file mode 100644
index 000000000..0a3a2ae43
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
@@ -0,0 +1,25 @@
+using Flow.Launcher.Plugin.Everything.Everything;
+using JetBrains.Annotations;
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Helper;
+
+public static class SortOptionTranslationHelper
+{
+ [CanBeNull]
+ public static IPublicAPI API { get; internal set; }
+
+ public static string GetTranslatedName(this SortOption sortOption)
+ {
+ const string prefix = "flowlauncher_plugin_everything_sort_by_";
+
+ ArgumentNullException.ThrowIfNull(API);
+
+ var enumName = Enum.GetName(sortOption);
+ var splited = enumName.Split('_');
+ var name = string.Join('_', splited[..^1]);
+ var direction = splited[^1];
+
+ return $"{API.GetTranslation(prefix + name.ToLower())} {API.GetTranslation(prefix + direction.ToLower())}";
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/context_menu.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/context_menu.png
new file mode 100644
index 000000000..c6138b765
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/context_menu.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png
index a8e27d342..745b34935 100644
Binary files a/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/deletefilefolder.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/error.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/error.png
new file mode 100644
index 000000000..3b17d925b
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/error.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/everything_error.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/everything_error.png
new file mode 100644
index 000000000..ad3eab179
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/everything_error.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/index.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/index.png
deleted file mode 100644
index a671dac21..000000000
Binary files a/Plugins/Flow.Launcher.Plugin.Explorer/Images/index.png and /dev/null differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error.png
new file mode 100644
index 000000000..518d1d75d
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error2.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error2.png
new file mode 100644
index 000000000..13a3d34fe
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/index_error2.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Images/robot_error.png b/Plugins/Flow.Launcher.Plugin.Explorer/Images/robot_error.png
new file mode 100644
index 000000000..6b4f83b42
Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.Explorer/Images/robot_error.png differ
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
new file mode 100644
index 000000000..ba2152e61
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Slet
+ Rediger
+ Tilføj
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Færdig
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Filredigeringssti
+ Mapperedigeringssti
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Slet
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
index 2209b5bed..dc97980fd 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
@@ -1,14 +1,143 @@
-
-
-
- Löschen
- Bearbeiten
- Hinzufügen
-
-
- Bitte wähle eine Ordnerverknüpfung
- Bist du sicher {0} zu löschen?
-
-
\ No newline at end of file
+
+
+
+
+ Please make a selection first
+ Bitte wähle eine Ordnerverknüpfung
+ Bist du sicher {0} zu löschen?
+ Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Löschen
+ Bearbeiten
+ Hinzufügen
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor pad
+ Shell Path
+ Index Search Excluded Paths
+ Verwenden Suchergebnis Standort als ausführbare Arbeitsverzeichnis
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Suche:
+ Pfad-Suche:
+ Suche nach Dateiinhalten:
+ Index-Suche:
+ Schnellzugriff:
+ Current Action Keyword
+ Fertig
+ Aktiviert
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Datei-Editor-Pfad
+ Ordner-Editor-Pfad
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Pfad kopieren
+ Copy path of current item to clipboard
+ Kopieren
+ Aktuelle Datei in Zwischenablage kopieren
+ Aktuellen Ordner in Zwischenablage kopieren
+ Löschen
+ Aktuelle Datei dauerhaft löschen
+ Aktuellen Ordner dauerhaft löschen
+ Pfad:
+ Ausgewählte löschen
+ Als anderer Benutzer ausführen
+ Ausgewählte mit einem anderen Benutzerkonto ausführen
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Everything Service läuft nicht
+ Everything Plugin hat einen Fehler (drücke Enter zum kopieren der Fehlernachricht)
+ Sort By
+ Name
+ Path
+ Größe
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Klicken, um Everything zu starten oder zu installieren
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Möchten Sie die Inhaltssuche für alles aktivieren?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index e23bd77bd..d5352ef1e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -1,28 +1,43 @@
-
+
-
+
Please make a selection first
Please select a folder link
Are you sure you want to delete {0}?
- Are you sure you want to permanently delete this {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
Deletion successful
- Successfully deleted the {0}
+ Successfully deleted {0}
Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
The required service for Windows Index Search does not appear to be running
To fix this, start the Windows Search service. Select here to remove this warning
The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
-
+
Delete
Edit
Add
+ General Setting
Customise Action Keywords
Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
Indexing Options
Search:
Path Search:
@@ -33,29 +48,51 @@
Done
Enabled
When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ File Editor Path
+ Folder Editor Path
-
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
Explorer
- Search and manage files and folders. Explorer utilises Windows Index Search
+ Find and manage files and folders via Windows Search or Everything
-
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
Copy path
+ Copy path of current item to clipboard
Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
Delete
+ Permanently delete current file
+ Permanently delete current folder
Path:
Delete the selected
Run as different user
Run the selected using a different user account
Open containing folder
- Opens the location that contains the file or folder
+ Open the location that contains current item
Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
Exclude current and sub-directories from Index Search
Excluded from Index Search
Open Windows Indexing Options
Manage indexed files and folders
Failed to open Windows Indexing Options
Add to Quick Access
- Add the current {0} to Quick Access
+ Add current item to Quick Access
Successfully Added
Successfully added to Quick Access
Successfully Removed
@@ -63,6 +100,46 @@
Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
Remove from Quick Access
Remove from Quick Access
- Remove the current {0} from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
-
\ No newline at end of file
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
new file mode 100644
index 000000000..ff1773c71
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Por favor, seleccione primero
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Eliminar
+ Editar
+ Añadir
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Ruta del editor
+ Shell Path
+ Index Search Excluded Paths
+ Usar la ubicación de los resultados de búsqueda como directorio de trabajo ejecutable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Hecho
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Ruta del editor
+ Folder Editor Path
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Eliminar
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Advertencia: El servicio de Everything no se está ejecutando
+ Error al consultar Everything
+ Ordenar por
+ Name
+ Ruta
+ Size
+ Extensión
+ Tipo de nombre
+ Fecha de creación
+ Fecha de modificación
+ Atributos
+ Lista de archivos Nombre del Archivo
+ Ejecutar cuenta
+ Fecha de cambio reciente
+ Fecha de acceso
+ Fecha de ejecución
+ ↑
+ ↓
+ Advertencia: No es una opción de orden rápido, las búsquedas pueden ser lentas
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Instalación de Everything
+ Instalando el servicio de Everything. Por favor, espere...
+ Servicio de Everything instalado correctamente
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Haga clic aquí para iniciarlo
+ No se ha podido encontrar una instalación de Everything, ¿quieres seleccionar manualmente una ubicación?{0}{0}Click no y todo se instalará automáticamente para usted
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
new file mode 100644
index 000000000..51b3e831b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Por favor haga una selección primero
+ Por favor, seleccione un enlace de carpeta
+ ¿Está seguro que desea eliminar {0}?
+ ¿Está seguro que desea eliminar permanentemente este archivo?
+ ¿Está seguro de que desea eliminar permanentemente este/esta archivo/carpeta?
+ Eliminación correcta
+ {0} se ha eliminado correctamente
+ Asignar la palabra clave de acción global podría generar demasiados resultados durante la búsqueda. Por favor, elija una palabra clave de acción específica
+ El acceso rápido no puede usar la palabra clave de acción global cuando está habilitado. Por favor, elija una palabra clave específica
+ El servicio requerido de indexación de búsqueda de Windows no parece estar ejecutándose
+ Para solucionarlo, inicie el servicio de búsqueda de Windows. Seleccione aquí para eliminar esta advertencia
+ El mensaje de advertencia se ha desactivado. Como alternativa para buscar archivos y carpetas, ¿desea instalar el complemento Everything?{0}{0}Seleccione 'Sí' para instalar el complemento Everything, o 'No' para volver
+ Explorador alternativo
+ Se ha producido un error durante la búsqueda: {0}
+ No se ha podido abrir la carpeta
+ No se ha podido abrir el archivo
+
+
+ Eliminar
+ Editar
+ Añadir
+ Configuración general
+ Personalizar palabras clave de acción
+ Enlaces de acceso rápido
+ Configuración Everything
+ Ordenar por:
+ Ruta de Everything:
+ Iniciar oculto
+ Ruta del editor
+ Ruta del Shell
+ Rutas excluídas del índice de búsqueda
+ Usar la ubicación de los resultados de búsqueda como directorio de trabajo del ejecutable
+ Pulsar Entrar para abrir la carpeta en el administrador de archivos predeterminado
+ Usar búsqueda indexada para buscar rutas
+ Opciones de indexación
+ Buscar:
+ Ruta de búsqueda:
+ Búsqueda de contenido de archivo:
+ Buscar índice:
+ Acceso rápido:
+ Palabra clave de acción actual
+ Aceptar
+ Activado
+ Cuando esté desactivado, Flow no ejecutará esta opción de búsqueda, y además volverá a '*' para liberar la palabra clave de acción
+ Everything
+ Índice de Windows
+ Enumeración directa
+ Ruta del editor de archivos
+ Ruta del editor de carpetas
+
+ Motor de búsqueda de contenido
+ Motor de búsqueda recursiva de directorio
+ Motor de búsqueda del Índice
+ Abrir opciones de indexación de Windows
+
+
+ Explorador
+ Busca y gestiona archivos y carpetas mediante Búsqueda de Windows o Everything
+
+
+ Ctrl + Entrar para abrir el directorio
+ Ctrl + Entrar para abrir la carpeta contenedora
+
+
+ Copiar ruta
+ Copia la ruta del elemento actual al portapapeles
+ Copiar
+ Copia el archivo actual al portapapeles
+ Copia la carpeta actual al portapapeles
+ Eliminar
+ Elimina permanentemente el archivo actual
+ Elimina permanentemente la carpeta actual
+ Ruta:
+ Elimina el seleccionado
+ Ejecutar como usuario diferente
+ Ejecuta la selección usando una cuenta de usuario diferente
+ Abrir carpeta contenedora
+ Abre la ubicación que contiene al elemento actual
+ Abrir con el editor:
+ No se pudo abrir el archivo en {0} con el editor {1} en {2}
+ Abrir con Shell:
+ No se pudo abrir la carpeta {0} con Shell {1} en {2}
+ Excluir la carpeta actual y sus subcarpetas del índice de búsqueda
+ Excluido del índice de búsqueda
+ Abrir opciones de indexación de Windows
+ Administra archivos y carpetas indexados
+ No se ha podido abrir las opciones de indexación de Windows
+ Añadir al acceso rápido
+ Añade elemento actual al acceso rápido
+ Añadido/a correctamente
+ Añadido correctamente al acceso rápido
+ Eliminado/a correctamente
+ Eliminado correctamente del acceso rápido
+ Añade al acceso rápido para que se pueda abrir con la palabra clave de acción que activa la búsqueda del explorador
+ Eliminar del acceso rápido
+ Eliminar del acceso rápido
+ Elimina elemento actual del acceso rápido
+ Mostrar menú contextual de Windows
+
+
+ {0} libre de {1}
+ Abrir en administrador de archivos predeterminado
+ Use '>' para buscar en este directorio, '*' para buscar extensiones de archivo o '>*' para combinar ambas búsquedas.
+
+
+ No se ha podido cargar Everything SDK
+ Advertencia: El servicio de Everything no se está ejecutando
+ Error al consultar Everything
+ Ordenar por
+ Nombre
+ Ruta
+ Tamaño
+ Extensión
+ Tipo
+ Fecha de creación
+ Fecha de modificación
+ Atributos
+ Nombre de la lista de archivos
+ Número de ejecuciones
+ Fecha de cambios recientes
+ Fecha de último acceso
+ Fecha de ejecución
+ ↑
+ ↓
+ Advertencia: Esta no es una opción de clasificación rápida, las búsquedas pueden ser lentas
+
+ Buscar ruta completa
+
+ Hacer clic para lanzar o instalar Everything
+ Instalación de Everything
+ Instalando el servicio de Everything. Por favor, espere...
+ Servicio de Everything instalado correctamente
+ No se ha podido instalar automáticamente el servicio de Everything. Por favor, instálelo manualmente desde https://www.voidtools.com
+ Hacer clic aquí para iniciarlo
+ No se ha podido encontrar una instalación de Everything, ¿desea seleccionar manualmente una ubicación?{0}{0}Si hace click en no, Everything se instalará automáticamente para usted
+ ¿Desea activar la búsqueda de contenidos de Everything?
+ Puede ser muy lento sin índice (solo se admite en Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
new file mode 100644
index 000000000..f4dd4e9d1
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Supprimer
+ Modifier
+ Ajouter
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Termin
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Chemin de l'éditeur de fichiers
+ Chemin de l'éditeur de dossier
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Supprimer
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Taille
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
new file mode 100644
index 000000000..30dfe71ed
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Cancella
+ Modifica
+ Aggiungi
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Tasto di accesso rapido alla finestra
+ Shell Path
+ Index Search Excluded Paths
+ Utilizza il percorso ottenuto dalla ricerca come cartella di lavoro
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Conferma
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Tutto
+ Windows Index
+ Direct Enumeration
+ Percorso dell'editor di file
+ Percorso dell'editor delle cartelle
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Cancella
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Attenzione: Il servizio "Everything" non è in esecuzione
+ Errore nell'interrogazione di Everything
+ Ordina per
+ Name
+ Percorso
+ Dimensioni
+ Estensione
+ Tipo
+ Data di creazione
+ Data della modifica
+ Attributi
+ Nome File Lista
+ Esegui Conteggio
+ Data di recente della modifica
+ Data di accesso
+ Data di esecuzione
+ ↑
+ ↓
+ Attenzione: Questa non è un'opzione di ordinamento rapido, le ricerche potrebbero essere lente
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Installazione di Everything
+ Installazione di everything. Si prega di attendere...
+ Everything è stato installato con successo
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Premi per avviare
+ Impossibile trovare l'installazione di Everything, vuoi inserire manualmente un percorso? {0} {0} Premi no per installare automaticamente Everything
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
new file mode 100644
index 000000000..bb831b003
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ 削除
+ 編
+ 追
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ 完
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ ファイル エディターのパス
+ フォルダー エディターのパス
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ 削除
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ サイズ
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
new file mode 100644
index 000000000..627338473
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ 항목을 먼저 선택하세요
+ 폴더 링크를 선택하세요
+ {0} - 삭제하시겠습니까?
+ 이 파일을 영구적으로 삭제하시겠습니까?
+ Are you sure you want to permanently delete this file/folder?
+ 삭제 완료
+ {0} - 성공적으로 삭제했습니다.
+ 글로벌 액션 키워드는 너무 많은 결과를 불러오게 될 수 있습니다. 특정한 액션 키워드를 선택하세요.
+ 빠른 접근은 글로벌 액션 키워드로 사용할 수 없습니다. 특정한 액션 키워드를 선택하세요.
+ 윈도우 색인 검색에 필요한 서비스가 실행되어 있지 않습니다.
+ 이 문제를 해결하려면 Windows Search Service를 시작하세요. 이 경고를 제거하려면 여기를 선택하세요.
+ 경고 메시지가 꺼졌습니다. 파일 및 폴더 검색을 위한 대안으로 Everything 플러그인을 설치하시겠습니까?{0}{0}Everything 플러그인을 설치하려면 '예'를 선택하고, 반환하려면 '아니오'를 선택하십시오
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ 삭제
+ 편집
+ 추가
+ 일반 설정
+ 사용자 지정 액션 키워드
+ 빠른 접근 항목
+ Everything 설정
+ 정렬 옵션:
+ Everything 경로:
+ Launch Hidden
+ 에디터 경로
+ 쉘 경로
+ 색인 제외 경로
+ 검색 결과위치를 실행 가능한 작업 디렉토리(Working Directory)로 사용
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ 색인 옵션
+ 검색:
+ 경로 검색:
+ 파일 내용 검색:
+ 색인 검색:
+ 빠른 접근:
+ 현재 액션 키워드
+ 완료
+ 켬
+ 비활성화하면 Flow가 이 검색 옵션을 실행하지 않고 추가로 '*'로 되돌아가 액션 키워드를 해제합니다.
+ Everything
+ Windows Index
+ Direct Enumeration
+ 파일 편집기 경로
+ 폴더 편집기 경로
+
+ 내용 검색 엔진
+ 경로 재귀 검색 엔진
+ 색인 검색 엔진
+ 윈도우 색인 설정 열기
+
+
+ 탐색기
+ 윈도우 색인 또는 Everything을 사용하여 파일과 폴더를 검색 및 관리합니다
+
+
+ Ctrl + Enter으로 폴더 열기
+ Ctrl + Enter으로 포함된 폴더 열기
+
+
+ 경로 복사
+ 이 항목의 경로를 클립보드에 복사
+ 복사하기
+ 이 파일을 클립보드에 복사
+ 이 파일을 클립보드에 복사
+ 삭제
+ 이 파일을 영구적으로 삭제
+ 이 폴더를 영구적으로 삭제
+ 경로:
+ 선택 항목을 삭제
+ 다른 유저 권한으로 실행
+ 선택한 사용자 계정으로 실행
+ 포함된 폴더 열기
+ 이 항목이 포함된 위치를 열기
+ 편집기에서 열기:
+ Failed to open file at {0} with Editor {1} at {2}
+ 쉘에서 열기:
+ Failed to open folder {0} with Shell {1} at {2}
+ 현재 폴더 및 하위폴더를 색인 검색에서 제외
+ 색인 검색에서 제외했습니다
+ 윈도우 인덱싱 옵션 열기
+ 폴더 및 파일의 색인 관리
+ 윈도우 인덱싱 옵션 열기에 실패했습니다
+ 빠른 접근에 추가
+ 빠른 접근에 이 항목을 추가
+ 성공적으로 추가되었습니다
+ 빠른 접근에 추가했습니다
+ 성공적으로 제거했습니다
+ 빠른 접근에서 제거했습니다
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ 빠른 접근에서 제거
+ 빠른 접근에서 제거
+ 이 항목을 빠른 접근에서 제거
+ 우클릭 메뉴 보기
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ 경고: Everything 서비스가 실행 중이 아닙니다
+ Error while querying Everything
+ 정렬 기준
+ Name
+ Path
+ 크기
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Everything을 실행 또는 설치하려면 클릭
+ Everything 설치
+ Everything 서비스 설치 중. 잠시 기다려주세요...
+ Everything 설치 완료
+ Everything 서비스 자동 설치에 실패했습니다. https://www.voidtools.com를 방문하여 직접 설치해주세요.
+ 여기를 클릭하여 시작
+ 설치된 Everything 찾을 수 없습니다. 위치를 수동으로 선택하시겠습니까?{0}{0}아니오를 클릭하면 모든 항목이 자동으로 설치됩니다.
+ Eveyrhing으로 내용 검색을 활성화하시겠습니까?
+ 인덱스가 없으면 매우 느릴 수 있습니다.(Everything v1.5+에서만 지원)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
new file mode 100644
index 000000000..0fe4db467
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Delete
+ Edit
+ Add
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Done
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Filredigeringsbane
+ Mapperedigeringsbane
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Delete
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
new file mode 100644
index 000000000..3649a2308
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Verwijder
+ Bewerken
+ Toevoegen
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Klaar
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Bestandseditor pad
+ Pad naar mapeditor
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Verwijder
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
index 9a6b38f6f..d42f1067e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
@@ -1,14 +1,143 @@
-
-
-
- Usuń
- Edytuj
- Dodaj
-
-
- Musisz wybrać któryś folder z listy
- Czy jesteś pewien że chcesz usunąć {0}?
-
-
\ No newline at end of file
+
+
+
+
+ Please make a selection first
+ Musisz wybrać któryś folder z listy
+ Czy jesteś pewien że chcesz usunąć {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Usuń
+ Edytuj
+ Dodaj
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Ścieżka edytora
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Zapisz
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Ścieżka edytora plików
+ Ścieżka edytora folderów
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Usu
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Everything Service nie jest uruchomiony
+ Wystąpił błąd podczas pobierania wyników z Everything
+ Sort By
+ Name
+ Path
+ Rozmiar
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
new file mode 100644
index 000000000..4b8865b84
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Apagar
+ Editar
+ Adicionar
+ General Setting
+ Customise Action Keywords
+ Links de Acesso Rápido
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Pesquisar:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Finalizado
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ File Editor Path
+ Folder Editor Path
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorador
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copiar
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Apagar
+ Permanently delete current file
+ Permanently delete current folder
+ Caminho:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Nome
+ Path
+ Tamanho
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index f87b9c0fe..b3d772498 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -1,27 +1,41 @@
-
- Primeiro, escolha uma selação
+
+ Tem que efetuar uma seleção
Selecione a ligação para a pasta
Tem a certeza de que deseja eliminar {0}?
- Tem certeza de que deseja eliminar permanentemente {0}?
+ Tem a certeza de que pretende eliminar permanentemente este ficheiro?
+ Tem a certeza de que pretende eliminar permanentemente este ficheiro ou pasta?
Eliminada com sucesso
- {0} foi eliminada com sucesso
- A atribuição de uma palavra-chave global pode devolver demasiados resultados. deve escolher uma palavra-chave específica.
- Se o plugin Acesso rápido estiver ativo, não pode ser definido como palavra-chave global. Por favor escolha outra.
+ {0} eliminado(a) com sucesso.
+ A atribuição de uma palavra-chave global pode devolver demasiados resultados. Deve escolher uma palavra-chave específica.
+ Se o plugin Acesso rápido estiver ativo, não pode ser ativado com a palavra-chave global. Por favor escolha outra.
Parece que o serviço de pesquisa Windows não está em execução.
Para corrigir, inicie o serviço Windows Search. Selecione aqui para remover este aviso.
A mensagem de aviso foi desativada. Como alternativa ao serviço de pesquisa Windows, gostaria de instalar o plugin Everything?{0}{0}Selecione 'Sim' para instalar ou 'Não' para não instalar.
Alternativa
+ Ocorreu um erro ao pesquisar: {0}
+ Não foi possível abrir a pasta
+ Não foi possível abrir o ficheiro
-
+
Eliminar
Editar
Adicionar
+ Definições gerais
Personalizar palavras-chave
Ligações de acesso rápido
+ Definições Everything
+ Ordenação:
+ Caminho para Everything:
+ Iniciar oculto
+ Caminho do editor
+ Caminho da consola
Caminhos excluídos do índice de pesquisa
+ Utilizar localização do resultado da pesquisa como pasta de trabalho do executável
+ Toque Enter para abrir a pasta no gestor de ficheiros
+ Utilizar índice de pesquisa para o caminho
Opções de indexação
Pesquisar:
Pesquisa de caminho:
@@ -31,30 +45,52 @@
Palavra-chave atual
Feito
Ativo
- Se desativar a opção, o Flow Launcher não irá executar esta opção de pesquisa e utilizará '*' para libertar a palavra-chave
+ Se desativar a opção, Flow Launcher não irá executar esta opção de pesquisa e utilizará '*' para libertar a palavra-chave
+ Everything
+ Índice do Windows
+ Enumeração direta
+ Caminho do editor de ficheiros
+ Caminho do editor de pastas
-
+ Mecanismo de pesquisa para conteúdo
+ Mecanismo de pesquisa recursiva de diretórios
+ Mecanismo de pesquisa do índice
+ Abrir opções de índice do Windows
+
+
Explorador
- Pesquisar e gerir ficheiros e pastas. O explorador utiliza o índice de pesquisa Windows.
+ Encontrar e gerir ficheiros/pastas através da Pesquisa Windows ou de Everything
-
+
+ Ctrl+Enter para abrir a pasta
+ Ctrl+Enter para abrir a pasta de destino
+
+
Copiar caminho
+ Copiar caminho do item atual para área de transferência
Copiar
+ Copiar ficheiro atual para a área de transferência
+ Copiar pasta atual para a área de transferência
Eliminar
+ Eliminar permanentemente o ficheiro atual
+ Eliminar permanentemente a pasta atual
Caminho:
Eliminar seleção
Executar com outro utilizador
Executar ações com uma conta de utilizador diferente
Abrir pasta de destino
- Abre a localização que contém o ficheiro ou a pasta
+ Abrir localização que contém o item atual
Abrir com o editor:
- Excluir diretório do índice de pesquisas
- Excluído do índice de pesquisa
+ Erro ao abrir o ficheiro {0} com o editor {1} em {2}
+ Abrir com a consola:
+ Erro ao abrir a pasta {0} com a consola {1} em {2}
+ Excluir pasta atual e subpastas do índice de pesquisas
+ Excluído do índice de pesquisas
Abrir opções de indexação do Windows
Gerir ficheiros e pastas indexadas
Não foi possível abrir as opções de indexação do Windows
Adicionar ao acesso rápido
- Adicionar {0} ao acesso rápido
+ Adicionar item ao Acesso rápido
Adicionado com sucesso
Adicionado com sucesso ao acesso rápido
Removido com sucesso
@@ -62,6 +98,46 @@
Adicionar ao acesso rápido para que possa ser aberto com a palavra-chave de ativação da pesquisa no explorador
Remover do acesso rápido
Remover do acesso rápido
- Remover {0} do acesso rápido
+ Remover item do Acesso rápido
+ Mostrar menu de contexto do Windows
+
+
+ {0} livre de {1} no total
+ Abrir no gestor de ficheiros padrão
+ Utilize '>' para pesquisar nesta pasta, '*' para pesquisar por extensão de ficheiro e '>*' para combinar ambas as anteriores.
+
+
+ Falha ao carregar Everything SDK
+ Aviso: o serviço Everything não está em execução
+ Erro ao consultar Everything
+ Ordenar por
+ Nome
+ Caminho
+ Tamanho
+ Extensão
+ Nome do tipo
+ Data de criação
+ Data de modificação
+ Atributos
+ Por nome na lista de ficheiros
+ Número de execuções
+ Data alterada recentemente
+ Data de acesso
+ Data de execução
+ ↑
+ ↓
+ Aviso: esta não é uma opção de ordenação rápida e as pesquisas podem ser demoradas
+
+ Pesquisar caminho completo
+
+ Clique para iniciar ou instalar Everything
+ Instalação Everything
+ A instalar o serviço Everything. Por favor aguarde...
+ Serviço Everything instalado com sucesso
+ Não foi possível instalar o serviço Everything. Descarregue a aplicação em https://www.voidtools.com e instale-a manualmente.
+ Clique aqui para iniciar
+ Não foi possível encontrar a instalação de Everything. Deseja especificar manualmente a localização?{0}{0}Clique Não e Everything será instalado automaticamente.
+ Deseja ativar a pesquisa de conteúdo através de Everything?
+ Pode ser muito lento sem índice (que apenas existe em Everything v1.5+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
new file mode 100644
index 000000000..73bd620e9
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Сначала отметьте что-нибудь
+ Please select a folder link
+ Вы уверены, что хотите удалить {0}?
+ Вы действительно хотите безвозвратно удалить этот файл?
+ Вы действительно хотите безвозвратно удалить этот файл/папку?
+ Удаление завершено
+ Успешно удалено {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Удалить
+ Редактировать
+ Добавить
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Подтвердить
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Путь к редактору файлов
+ Путь к редактору папки
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Удалить
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Размер
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index 82ba1c7d4..3de63546b 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -1,67 +1,143 @@
-
+
Najprv vyberte položku
Vyberte odkaz na priečinok
Naozaj chcete odstrániť {0}?
- Naozaj chcete natrvalo odstrániť {0}?
+ Naozaj chcete natrvalo odstrániť tento súbor?
+ Naozaj chcete natrvalo odstrániť tento súbor/priečinok?
Odstránenie bolo úspešné
- Úspešne odstránený {0}
+ Úspešne odstránené {0}
Priradenie globálneho aktivačného príkazu by mohlo počas vyhľadávania poskytnúť príliš veľa výsledkov. Vyberte si konkrétny aktivačný príkaz
Ak je rýchly prístup povolený, nemôže byť nastavený globálny aktivačný príkaz. Prosím, vyberte konkrétny aktivačný príkaz
Zdá sa, že požadovaná služba Windows Index Search nie je spustená
Ak to chcete opraviť, spustite službu Windows Search. Ak chcete odstrániť toto upozornenie, kliknite sem
Upozornenie bolo vypnuté. Chceli by ste ako alternatívu na vyhľadávanie súborov a priečinkov nainštalovať plugin Everything?{0}{0}Ak chcete nainštalovať plugin Everything, zvoľte 'Áno', pre návrat zvoľte 'Nie'
- Alternatíva pre Preskumníka
+ Alternatíva pre Prieskumníka
+ Počas vyhľadávania došlo k chybe: {0}
+ Nepodarilo sa otvoriť priečinok
+ Nepodarilo sa otvoriť súbor
-
+
Odstrániť
Upraviť
Pridať
+ Všeobecné nastavenia
Upraviť aktivačný príkaz
Odkazy Rýchleho prístupu
+ Nastavenia Everything
+ Zoradenie:
+ Umiestnenie Everything:
+ Spustiť skryté
+ Cesta k editoru
+ Cesta k príkazovému riadku
Vylúčené umiestnenia indexovania
+ Použiť umiestnenie výsledku vyhľadávania ako pracovný priečinok spustiteľného súboru
+ Stlačením klávesu Enter otvoríte priečinok v predvolenom správcovi súborov
+ Na vyhľadanie cesty použiť vyhľadávanie v indexe
Možnosti indexovania
Vyhľadávanie:
Cesta vyhľadávania:
- Vyhľadávanie v obsahu súborov:
+ Vyhľadávanie obsahu súborov:
Vyhľadávanie v indexe:
Rýchly prístup:
Aktuálny aktivačný príkaz
Hotovo
Povolené
Ak je vypnuté, Flow túto možnosť vyhľadávania nevykoná a následne sa vráti späť na "*", aby sa uvoľnila skratka akcie
+ Everything
+ Index Windowsu
+ Zoznam priečinkov
+ Cesta k editoru súborov
+ Cesta k editoru priečinkov
-
+ Vyhľadávač obsahu
+ Priečinkový rekurzívny vyhľadávač
+ Indexový vyhľadávač
+ Otvoriť možnosti vyhľadávania vo Windowse
+
+
Prieskumník
- Vyhľadáva a spravuje súbory a priečinky. Prieskumník používa indexovanie vyhľadávania vo Windowse
+ Vyhľadáva a spravuje súbory i priečinky cez Windows Search alebo Everything
-
+
+ Ctrl + Enter na otvorenie priečinka
+ Ctrl + Enter na otvorenie umiestnenia priečinka
+
+
Kopírovať cestu
+ Skopírovať cestu k aktuálnej položke do schránky
Kopírovať
+ Skopírovať aktuálny súbor do schránky
+ Skopírovať aktuálny priečinok do schránky
Odstrániť
+ Natrvalo odstrániť aktuálny súbor
+ Natrvalo odstrániť aktuálny priečinok
Cesta:
- Odstrániť vybrané
+ Odstrániť vybraný
Spustiť ako iný používateľ
Spustí vybranú položku ako používateľ s iným kontom
Otvoriť umiestnenie priečinka
- Otvorí umiestnenie, ktoré obsahuje súbor alebo priečinok
+ Otvoriť umiestnenie aktuálnej položky
Otvoriť v editore:
+ Nepodarilo sa otvoriť súbor {0} v editore {1} – {2}
+ Otvoriť v príkazovom riadku:
+ Nepodarilo sa otvoriť priečinok {0} v prostredí {1} – {2}
Vylúčiť položku a jej podpriečinky z indexu vyhľadávania
Vylúčiť z indexu vyhľadávania
Otvoriť možnosti vyhľadávania vo Windowse
Správa indexovaných súborov a priečinkov
Nepodarilo sa otvoriť možnosti indexu vyhľadávania
Pridať do Rýchleho prístupu
- Pridať tento {0} do Rýchleho prístupu
+ Pridať aktuálnu položku do Rýchleho prístupu
Úspešne pridané
Úspešne pridané do Rýchleho prístupu
Úspešne odstránené
Úspešne odstránené z Rýchleho prístupu
Pridať do Rýchleho prístupu, aby ho bolo možné otvoriť pomocou aktivačného príkazu pluginu Prieskumník
Odstráni z Rýchleho prístupu
- Odstrániť z Rýchleho prístupu
- Odstráni {0} z Rýchleho prístupu
+ Odstráni z Rýchleho prístupu
+ Odstrániť aktuálnu položku z Rýchleho prístupu
+ Zobraziť kontextovú ponuku Windowsu
+
+
+ Voľných {0} z {1}
+ Otvoriť v predvolenom správcovi súborov
+ Použite ">" na vyhľadávanie v tomto priečinku, "*" na vyhľadávanie prípon súborov alebo ">*" na kombináciu oboch hľadaní.
+
+
+ Nepodarilo sa načítať SDK Everything
+ Upozornenie: Služba Everything nie je spustená
+ Chyba pri dopytovaní Everything
+ Zoradiť podľa
+ Názov
+ Cesta
+ Veľkosť
+ Prípona
+ Typ
+ Dátum vytvorenia
+ Dátum úpravy
+ Atribúty
+ Zoznam názvov súborov
+ Počet spustení
+ Nedávno zmenený dátum
+ Dátum prístupu
+ Dátum spustenia
+ ↑
+ ↓
+ Upozornenie: Toto nie je voľba Fast Sort, vyhľadávanie môže byť pomalé
+
+ Vyhľadávanie celej cesty
+
+ Kliknutím spustíte alebo nainštalujete Everything
+ Inštalácia Everything
+ Inštaluje sa služba Everything. Čakajte, prosím…
+ Služba Everything bola úspešne nainštalovaná
+ Automatická inštalácia služby Everything zlyhala. Prosím, nainštalujte ju manuálne z https://www.voidtools.com
+ Kliknutím sem ju spustíte
+ Nepodarilo sa nájsť inštaláciu Everything, chcete manuálne vybrať jej umiestnenie?{0}{0}Kliknutím na nie sa Everything automaticky nainštaluje
+ Chcete povoliť vyhľadávanie obsahu cez Everything?
+ Bez indexu (ktorý je podporovaný len v Everything v1.5+) to môže byť veľmi pomalé
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
new file mode 100644
index 000000000..38aa39f94
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Obriši
+ Izmeni
+ Dodaj
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Gotovo
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ File Editor Path
+ Folder Editor Path
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Obriši
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
index d6744fdd4..b91297563 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
@@ -1,14 +1,143 @@
-
-
-
- Sil
- Düzenle
- Ekle
-
-
- Lütfen bir klasör bağlantısı seçin
- {0} bağlantısını silmek istediğinize emin misiniz?
-
-
\ No newline at end of file
+
+
+
+
+ Please make a selection first
+ Lütfen bir klasör bağlantısı seçin
+ {0} bağlantısını silmek istediğinize emin misiniz?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Sil
+ Düzenle
+ Ekle
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Düzenleyici Konumu
+ Shell Path
+ Index Search Excluded Paths
+ Programın çalışma klasörü olarak sonuç klasörünü kullan
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Tamam
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Düzenleyici Konumu
+ Folder Editor Path
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Sil
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Everything Servisi çalışmıyor
+ Sorgu Everything üzerinde çalıştırılırken hata oluştu
+ Sort By
+ Name
+ Path
+ Boyut
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
new file mode 100644
index 000000000..6d5ca1bb4
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -0,0 +1,143 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Видалити
+ Редагувати
+ Додати
+ General Setting
+ Customise Action Keywords
+ Quick Access Links
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Готово
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ Шлях редактора файлів
+ Шлях редактора папок
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+
+
+ Copy path
+ Copy path of current item to clipboard
+ Copy
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ Видалити
+ Permanently delete current file
+ Permanently delete current folder
+ Path:
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name
+ Path
+ Size
+ Extension
+ Type Name
+ Date Created
+ Date Modified
+ Attributes
+ File List FileName
+ Run Count
+ Date Recently Changed
+ Date Accessed
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index dac6e908b..15dc9cea4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -1,57 +1,143 @@
-
-
-
- 请先选择
- 请选择一个文件夹链接
- 您确定要删除 {0} 吗?
- 您确定要永久删除此 {0} 吗?
- 删除成功
- 已成功删除 {0}
- 使用全局操作关键字可能会在搜索过程中带来太多结果。请使用一个特定的操作关键字。
-
-
- 删除
- 编辑
- 添加
- 自定义动作关键字
- 快速访问链接
- 索引搜索排除的路径
- 索引选项
- 搜索激活:
- 路径搜索激活:
- 文件内容搜索:
-
-
- Explorer
- 利用Windows索引来搜索和管理文件和文件夹。
-
-
- 复制路径
- 复制
- 删除
- 路径:
- 删除所选
- 以其他用户身份运行
- 使用其他用户帐户运行所选的
- 打开文件所在文件夹
- 打开文件或文件夹所在目录
- 使用编辑器打开:
- 从索引搜索中排除当前目录和子目录
- 从索引搜索中排除
- 打开Windows索引选项
- 管理索引文件和文件夹
- 无法打开Windows索引选项
- 添加到快速访问
- 将 {0} 添加到快速访问中
- 添加完成
- 成功添加到快速访问
- 删除完成
- 已成功从快速访问中删除
- 添加到快速访问,以便可以使用Explorer的搜索关键字将其打开
- 从快速访问中删除
- 从快速访问中删除
- 从快速访问中删除 {0}
-
-
\ No newline at end of file
+
+
+
+
+ 请先进行选择
+ 请选择一个文件夹链接
+ 您确定要删除 {0} 吗?
+ 您确定要永久删除此文件吗?
+ 您确定要永久删除此文件/文件夹吗?
+ 删除成功
+ 已成功删除 {0}
+ 使用全局操作关键字可能会在搜索过程中带来太多结果。请使用一个特定的操作关键字。
+ 无法使用全局动作关键词作为快速访问关键字,请指定动作关键字
+ Windows 索引搜索所需的服务似乎没有运行
+ 若要解决这个问题,请启动 Windows 搜索服务。点击此处删除警告
+ 警告消息已关闭。 作为搜索文件和文件夹的一个替代办法,你想要安装 Everything 插件吗?{0}{0}选择 '是'安装Everything插件',或者'否' 退出
+ 资源管理器选项
+ 搜索时发生错误:{0}
+ 无法打开文件夹
+ 无法打开文件
+
+
+ 删除
+ 编辑
+ 添加
+ 通用设置
+ 自定义动作关键字
+ 快速访问链接
+ Everything 设置
+ 排序选项
+ Everything 路径
+ 隐藏启动
+ 编辑器路径
+ Shell 路径
+ 索引搜索排除的路径
+ 使用搜索结果的位置作为应用程序的工作目录
+ 点击回车在默认文件管理器中打开文件夹
+ 使用索引进行路径搜索
+ 索引选项
+ 搜索:
+ 路径搜索:
+ 文件内容搜索:
+ 索引搜索:
+ 快速访问:
+ 当前触发关键字
+ 确认
+ 已启用
+ 当禁用时,Flow Launcher 将不会执行此搜索选项,并且还会恢复到“*”以释放动作关键字
+ Everything
+ Windows 索引
+ 直接枚举
+ 编辑器路径(文件)
+ 编辑器路径(文件夹)
+
+ 文件内容搜索引擎
+ 目录递归搜索引擎
+ 索引搜索引擎
+ 打开 Windows 索引选项
+
+
+ 文件管理器
+ 利用 Windows 搜索或者 Everything 查找和管理文件
+
+
+ Ctrl + Enter 以打开目录
+ Ctrl + Enter 以打开所在的文件夹
+
+
+ 复制路径
+ 复制当前结果的路径到剪贴板
+ 复制
+ 复制当前文件到剪贴板
+ 复制当前文件夹到剪贴板
+ 删除
+ 永久删除当前文件
+ 永久删除当前文件夹
+ 路径:
+ 删除所选内容
+ 以其他用户身份运行
+ 使用其他用户帐户运行所选内容
+ 打开文件所在文件夹
+ 打开包含该项目的文件夹
+ 使用编辑器打开:
+ 使用编辑器 {1} ({2}) 打开文件 {0} 时失败
+ 使用 Shell 打开:
+ 使用 Shell {1} ({2}) 打开文件夹 {0} 时失败
+ 从索引搜索中排除当前目录和子目录
+ 从索引搜索中排除
+ 打开Windows索引选项
+ 管理索引文件和文件夹
+ 无法打开Windows索引选项
+ 添加到快速访问
+ 将当前结果添加到“快速访问”
+ 添加完成
+ 成功添加到快速访问
+ 删除完成
+ 已成功从快速访问中删除
+ 添加到快速访问,以便可以使用Explorer的搜索关键字将其打开
+ 从快速访问中删除
+ 从快速访问中删除
+ 从快速访问中移除当前结果
+ 显示 Windows 上下文菜单
+
+
+ {0} 可用,共 {1}
+ 在默认文件管理器中打开
+ 使用 '>' 在这个目录中搜索,'*' 以搜索文件扩展名或 '>*' 以结合这两个搜索。
+
+
+ 加载 Everything SDK 失败
+ 警告:Everything 服务未运行
+ Everything 插件发生了一个错误(回车拷贝具体错误信息)
+ 排序依据
+ 名称
+ 路径
+ 大小
+ 扩展名
+ 类型名称
+ 创建日期
+ 修改日期
+ 属性
+ 文件列表名
+ 运行次数
+ 最近更改日期
+ 访问日期
+ 运行日期
+ ↑
+ ↓
+ 警告:这不是一个快速排序选项,搜索可能较慢。
+
+ 搜索完整路径
+
+ 单击启动或安装 Everything
+ Everything 安装
+ 正在安装 Everything 服务。请稍后...
+ 成功安装了 Everything 服务
+ 自动安装 Everything 服务失败。请从 https://www.voidtools.com 手动下载并安装。
+ 单击此处开始
+ 无法找到任何 Everything 安装,您想手动选择一个位置吗?{0}{0} 单击 不 将自动为您安装 Everything。
+ 您想要启用 Everything 的内容搜索功能吗?
+ 如果没有索引,它可能会非常慢(索引仅在 Everything v1.5+ 中支持)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
index 1455aa676..d04bd8edd 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
@@ -1,14 +1,143 @@
-
-
-
- 刪除
- 編輯
- 新增
-
-
- 請選擇一個資料夾
- 你確認要刪除{0}嗎?
-
-
+
+
+
+
+ Please make a selection first
+ 請選擇一個資料夾
+ 你確認要刪除{0}嗎?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ 成功刪除
+ 已成功刪除 {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ 刪除
+ 編輯
+ 新增
+ General Setting
+ Customise Action Keywords
+ 快速訪問連結
+ Everything Setting
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ 編輯器路
+ Shell Path
+ Index Search Excluded Paths
+ 使用程式所在目錄作為工作目錄
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ 索引選項
+ 搜尋:
+ Path Search:
+ File Content Search:
+ Index Search:
+ 快速存取:
+ Current Action Keyword
+ 確
+ 已啟用
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ 文件編輯器路徑
+ 文件夾編輯器路徑
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+
+
+ 檔案總管
+ 透過 Windows 搜尋或 Everything 搜尋和管理檔案和資料夾
+
+
+ Ctrl + Enter 以開啟該目錄。
+ Ctrl + Enter to open the containing folder
+
+
+ 複製路徑
+ Copy path of current item to clipboard
+ 複製
+ Copy current file to clipboard
+ Copy current folder to clipboard
+ 刪除
+ Permanently delete current file
+ Permanently delete current folder
+ 路徑:
+ 刪除所選內容
+ Run as different user
+ Run the selected using a different user account
+ 開啟檔案位置
+ Open the location that contains current item
+ 在編輯器中開啟:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ 添加成功
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ 從快速訪問中移除
+ 從快速訪問中移除
+ Remove current item from Quick Access
+ Show Windows Context Menu
+
+
+ {0} free of {1}
+ Open in Default File Manager
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+ Failed to load Everything SDK
+ Everything Service 尚未啟動
+ Everything 套件發生錯誤(Enter 複製具體錯誤訊息)
+ 排序依據
+ 名稱
+ 路徑
+ 大小
+ 擴展程序
+ 類型
+ 創建日期
+ 修改日期
+ 屬性
+ File List FileName
+ 執行次數
+ 近期變更
+ 存取日期
+ Date Run
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+
+ Click to launch or install Everything
+ Everything 安裝程序
+ 正在安裝 Everything 服務,請稍後...
+ 成功安裝 Everything 服務
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ 點此開始
+ 無法找到任何已安裝的 Everything,您想手動選擇位置嗎?{0}{0}點擊不 Everything 將會自動為您安裝。
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index 60208759e..82a5d5441 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -1,19 +1,22 @@
-using Flow.Launcher.Infrastructure.Storage;
+using Flow.Launcher.Plugin.Explorer.Helper;
using Flow.Launcher.Plugin.Explorer.Search;
-using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.ViewModels;
using Flow.Launcher.Plugin.Explorer.Views;
+using System;
using System.Collections.Generic;
-using System.Linq;
+using System.IO;
using System.Threading;
using System.Threading.Tasks;
+using System.Windows;
using System.Windows.Controls;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
namespace Flow.Launcher.Plugin.Explorer
{
public class Main : ISettingProvider, IAsyncPlugin, IContextMenu, IPluginI18n
{
- internal PluginInitContext Context { get; set; }
+ internal static PluginInitContext Context { get; set; }
internal Settings Settings;
@@ -31,23 +34,19 @@ namespace Flow.Launcher.Plugin.Explorer
public Task InitAsync(PluginInitContext context)
{
Context = context;
-
+
Settings = context.API.LoadSettingJsonStorage();
viewModel = new SettingsViewModel(context, Settings);
-
-
- // as at v1.7.0 this is to maintain backwards compatibility, need to be removed afterwards.
- if (Settings.QuickFolderAccessLinks.Any())
- {
- Settings.QuickAccessLinks = Settings.QuickFolderAccessLinks;
- Settings.QuickFolderAccessLinks = new List();
- }
contextMenu = new ContextMenu(Context, Settings, viewModel);
searchManager = new SearchManager(Settings, Context);
ResultManager.Init(Context, Settings);
+
+ SortOptionTranslationHelper.API = context.API;
+ EverythingApiDllImport.Load(Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "EverythingSDK",
+ Environment.Is64BitProcess ? "x64" : "x86"));
return Task.CompletedTask;
}
@@ -58,7 +57,34 @@ namespace Flow.Launcher.Plugin.Explorer
public async Task> QueryAsync(Query query, CancellationToken token)
{
- return await searchManager.SearchAsync(query, token);
+ try
+ {
+ return await searchManager.SearchAsync(query, token);
+ }
+ catch (Exception e) when (e is SearchException or EngineNotAvailableException)
+ {
+ return new List
+ {
+ new()
+ {
+ Title = e.Message,
+ SubTitle = e is EngineNotAvailableException { Resolution: { } resolution }
+ ? resolution
+ : "Enter to copy the message to clipboard",
+ Score = 501,
+ IcoPath = e is EngineNotAvailableException { ErrorIcon: { } iconPath }
+ ? iconPath
+ : Constants.GeneralSearchErrorImagePath,
+ AsyncAction = e is EngineNotAvailableException {Action: { } action}
+ ? action
+ : _ =>
+ {
+ Clipboard.SetDataObject(e.ToString());
+ return new ValueTask(true);
+ }
+ }
+ };
+ }
}
public string GetTranslatedPluginTitle()
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Constants.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Constants.cs
index 78c7c98a5..2174aeee6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Constants.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Constants.cs
@@ -17,6 +17,12 @@ namespace Flow.Launcher.Plugin.Explorer.Search
internal const string IndexingOptionsIconImagePath = "Images\\windowsindexingoptions.png";
internal const string QuickAccessImagePath = "Images\\quickaccess.png";
internal const string RemoveQuickAccessImagePath = "Images\\removequickaccess.png";
+ internal const string ShowContextMenuImagePath = "Images\\context_menu.png";
+ internal const string EverythingErrorImagePath = "Images\\everything_error.png";
+ internal const string IndexSearchWarningImagePath = "Images\\index_error.png";
+ internal const string WindowsIndexErrorImagePath = "Images\\index_error2.png";
+ internal const string GeneralSearchErrorImagePath = "Images\\robot_error.png";
+
internal const string ToolTipOpenDirectory = "Ctrl + Enter to open the directory";
@@ -26,7 +32,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
internal const string DefaultContentSearchActionKeyword = "doc:";
- internal const char DirectorySeperator = '\\';
+ internal const char DirectorySeparator = '\\';
internal const string WindowsIndexingOptions = "srchadmin.dll";
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/DirectoryInfo/DirectoryInfoSearch.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/DirectoryInfo/DirectoryInfoSearch.cs
index 14c90d57f..9fd495f49 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/DirectoryInfo/DirectoryInfoSearch.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/DirectoryInfo/DirectoryInfoSearch.cs
@@ -1,4 +1,4 @@
-using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Collections.Generic;
@@ -10,18 +10,18 @@ namespace Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo
{
public static class DirectoryInfoSearch
{
- internal static List TopLevelDirectorySearch(Query query, string search, CancellationToken token)
+ internal static IEnumerable TopLevelDirectorySearch(Query query, string search, CancellationToken token)
{
var criteria = ConstructSearchCriteria(search);
if (search.LastIndexOf(Constants.AllFilesFolderSearchWildcard) >
- search.LastIndexOf(Constants.DirectorySeperator))
+ search.LastIndexOf(Constants.DirectorySeparator))
return DirectorySearch(new EnumerationOptions
{
RecurseSubdirectories = true
- }, query, search, criteria, token);
+ }, search, criteria, token);
- return DirectorySearch(new EnumerationOptions(), query, search, criteria,
+ return DirectorySearch(new EnumerationOptions(), search, criteria,
token); // null will be passed as default
}
@@ -29,14 +29,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo
{
string incompleteName = "";
- if (!search.EndsWith(Constants.DirectorySeperator))
+ if (!search.EndsWith(Constants.DirectorySeparator))
{
- var indexOfSeparator = search.LastIndexOf(Constants.DirectorySeperator);
+ var indexOfSeparator = search.LastIndexOf(Constants.DirectorySeparator);
- incompleteName = search.Substring(indexOfSeparator + 1).ToLower();
+ incompleteName = search[(indexOfSeparator + 1)..].ToLower();
if (incompleteName.StartsWith(Constants.AllFilesFolderSearchWildcard))
- incompleteName = "*" + incompleteName.Substring(1);
+ incompleteName = string.Concat("*", incompleteName.AsSpan(1));
}
incompleteName += "*";
@@ -44,46 +44,45 @@ namespace Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo
return incompleteName;
}
- private static List DirectorySearch(EnumerationOptions enumerationOption, Query query, string search,
+ private static IEnumerable DirectorySearch(EnumerationOptions enumerationOption, string search,
string searchCriteria, CancellationToken token)
{
- var results = new List();
+ var results = new List();
var path = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(search);
- var folderList = new List();
- var fileList = new List();
-
try
{
var directoryInfo = new System.IO.DirectoryInfo(path);
- foreach (var fileSystemInfo in directoryInfo.EnumerateFileSystemInfos(searchCriteria, enumerationOption)
- )
+ foreach (var fileSystemInfo in directoryInfo.EnumerateFileSystemInfos(searchCriteria, enumerationOption))
{
- if (fileSystemInfo is System.IO.DirectoryInfo)
+ results.Add(new SearchResult
{
- folderList.Add(ResultManager.CreateFolderResult(fileSystemInfo.Name, fileSystemInfo.FullName,
- fileSystemInfo.FullName, query, 0, true, false));
- }
- else
- {
- fileList.Add(ResultManager.CreateFileResult(fileSystemInfo.FullName, query, 0, true, false));
- }
+ FullPath = fileSystemInfo.FullName,
+ Type = fileSystemInfo switch
+ {
+ System.IO.DirectoryInfo {Parent: null} => ResultType.Volume,
+ System.IO.DirectoryInfo => ResultType.Folder,
+ FileInfo => ResultType.File,
+ _ => throw new ArgumentOutOfRangeException(nameof(fileSystemInfo))
+ },
+ WindowsIndexed = false
+ });
- token.ThrowIfCancellationRequested();
+ if (token.IsCancellationRequested)
+ return results;
}
}
catch (Exception e)
{
- Log.Exception("Flow.Plugin.Explorer.", nameof(DirectoryInfoSearch), e);
- results.Add(new Result {Title = e.Message, Score = 501});
-
- return results;
+ Log.Exception(nameof(DirectoryInfoSearch), "Error occurred while searching path", e);
+
+ throw;
}
// Initial ordering, this order can be updated later by UpdateResultView.MainViewModel based on history of user selection.
- return results.Concat(folderList.OrderBy(x => x.Title)).Concat(fileList.OrderBy(x => x.Title)).ToList();
+ return results.OrderBy(r=>r.Type).ThenBy(r=>r.FullPath);
}
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
index 595ac3610..e526fb85a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
@@ -1,70 +1,75 @@
-using System;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
-using System.Text;
+using System.Linq;
+using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Plugin.Explorer.Search
{
public static class EnvironmentVariables
{
- internal static bool IsEnvironmentVariableSearch(string search)
+ private static Dictionary _envStringPaths = null;
+ private static Dictionary EnvStringPaths
{
- return search.StartsWith("%")
- && search != "%%"
- && !search.Contains("\\") &&
- LoadEnvironmentStringPaths().Count > 0;
+ get
+ {
+ if (_envStringPaths == null)
+ {
+ LoadEnvironmentStringPaths();
+ }
+ return _envStringPaths;
+ }
}
- internal static Dictionary LoadEnvironmentStringPaths()
+ internal static bool IsEnvironmentVariableSearch(string search)
{
- var envStringPaths = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
+ return search.StartsWith("%")
+ && search != "%%"
+ && !search.Contains('\\')
+ && EnvStringPaths.Count > 0;
+ }
+
+ public static bool HasEnvironmentVar(string search)
+ {
+ // "c:\foo %appdata%\" returns false
+ var splited = search.Split(Path.DirectorySeparatorChar);
+ return splited.Any(dir => dir.StartsWith('%') &&
+ dir.EndsWith('%') &&
+ dir.Length > 2 &&
+ dir.Split('%').Length == 3);
+ }
+
+ private static void LoadEnvironmentStringPaths()
+ {
+ _envStringPaths = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
+ var homedrive = Environment.GetEnvironmentVariable("HOMEDRIVE")?.EnsureTrailingSlash() ?? "C:\\";
foreach (DictionaryEntry special in Environment.GetEnvironmentVariables())
{
var path = special.Value.ToString();
+ // we add a trailing slash to the path to make sure drive paths become valid absolute paths.
+ // for example, if %systemdrive% is C: we turn it to C:\
+ path = path.EnsureTrailingSlash();
+
+ // if we don't have an absolute path, we use Path.GetFullPath to get one.
+ // for example, if %homepath% is \Users\John we turn it to C:\Users\John
+ // Add basepath for GetFullPath() to parse %HOMEPATH% correctly
+ path = Path.IsPathFullyQualified(path) ? path : Path.GetFullPath(path, homedrive);
+
if (Directory.Exists(path))
{
- // we add a trailing slash to the path to make sure drive paths become valid absolute paths.
- // for example, if %systemdrive% is C: we turn it to C:\
- path = path.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;
-
- // if we don't have an absolute path, we use Path.GetFullPath to get one.
- // for example, if %homepath% is \Users\John we turn it to C:\Users\John
- path = Path.IsPathFullyQualified(path) ? path : Path.GetFullPath(path);
-
// Variables are returned with a mixture of all upper/lower case.
- // Call ToLower() to make the results look consistent
- envStringPaths.Add(special.Key.ToString().ToLower(), path);
+ // Call ToUpper() to make the results look consistent
+ _envStringPaths.Add(special.Key.ToString().ToUpper(), path);
}
}
-
- return envStringPaths;
- }
-
- internal static string TranslateEnvironmentVariablePath(string environmentVariablePath)
- {
- var envStringPaths = LoadEnvironmentStringPaths();
- var splitSearch = environmentVariablePath.Substring(1).Split("%");
- var exactEnvStringPath = splitSearch[0];
-
- // if there are more than 2 % characters in the query, don't bother
- if (splitSearch.Length == 2 && envStringPaths.ContainsKey(exactEnvStringPath))
- {
- var queryPartToReplace = $"%{exactEnvStringPath}%";
- var expandedPath = envStringPaths[exactEnvStringPath];
- // replace the %envstring% part of the query with its expanded equivalent
- return environmentVariablePath.Replace(queryPartToReplace, expandedPath);
- }
-
- return environmentVariablePath;
}
internal static List GetEnvironmentStringPathSuggestions(string querySearch, Query query, PluginInitContext context)
{
var results = new List();
- var environmentVariables = LoadEnvironmentStringPaths();
var search = querySearch;
if (querySearch.EndsWith("%") && search.Length > 1)
@@ -72,12 +77,12 @@ namespace Flow.Launcher.Plugin.Explorer.Search
// query starts and ends with a %, find an exact match from env-string paths
search = querySearch.Substring(1, search.Length - 2);
- if (environmentVariables.ContainsKey(search))
+ if (EnvStringPaths.ContainsKey(search))
{
- var expandedPath = environmentVariables[search];
-
+ var expandedPath = EnvStringPaths[search];
+
results.Add(ResultManager.CreateFolderResult($"%{search}%", expandedPath, expandedPath, query));
-
+
return results;
}
}
@@ -90,8 +95,8 @@ namespace Flow.Launcher.Plugin.Explorer.Search
{
search = search.Substring(1);
}
-
- foreach (var p in environmentVariables)
+
+ foreach (var p in EnvStringPaths)
{
if (p.Key.StartsWith(search, StringComparison.InvariantCultureIgnoreCase))
{
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs
new file mode 100644
index 000000000..e618b5c36
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs
@@ -0,0 +1,206 @@
+using Flow.Launcher.Plugin.Everything.Everything;
+using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms.Design;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
+{
+ public static class EverythingApi
+ {
+ private const int BufferSize = 4096;
+
+ private static readonly SemaphoreSlim _semaphore = new(1, 1);
+
+ // cached buffer to remove redundant allocations.
+ private static readonly StringBuilder buffer = new(BufferSize);
+
+ public enum StateCode
+ {
+ OK,
+ MemoryError,
+ IPCError,
+ RegisterClassExError,
+ CreateWindowError,
+ CreateThreadError,
+ InvalidIndexError,
+ InvalidCallError
+ }
+
+ const uint EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME = 0x00000004u;
+ const uint EVERYTHING_REQUEST_RUN_COUNT = 0x00000400u;
+
+ ///
+ /// Checks whether the sort option is Fast Sort.
+ ///
+ public static bool IsFastSortOption(SortOption sortOption)
+ {
+ var fastSortOptionEnabled = EverythingApiDllImport.Everything_IsFastSort(sortOption);
+
+ // If the Everything service is not running, then this call will incorrectly report
+ // the state as false. This checks for errors thrown by the api and up to the caller to handle.
+ CheckAndThrowExceptionOnError();
+
+ return fastSortOptionEnabled;
+ }
+
+ public static async ValueTask IsEverythingRunningAsync(CancellationToken token = default)
+ {
+ await _semaphore.WaitAsync(token);
+
+ try
+ {
+ EverythingApiDllImport.Everything_GetMajorVersion();
+ var result = EverythingApiDllImport.Everything_GetLastError() != StateCode.IPCError;
+ return result;
+ }
+ finally
+ {
+ _semaphore.Release();
+ }
+ }
+
+ ///
+ /// Searches the specified key word and reset the everything API afterwards
+ ///
+ /// Search Criteria
+ /// when cancelled the current search will stop and exit (and would not reset)
+ /// An IAsyncEnumerable that will enumerate all results searched by the specific query and option
+ public static async IAsyncEnumerable SearchAsync(EverythingSearchOption option,
+ [EnumeratorCancellation] CancellationToken token)
+ {
+ if (option.Offset < 0)
+ throw new ArgumentOutOfRangeException(nameof(option.Offset), option.Offset, "Offset must be greater than or equal to 0");
+
+ if (option.MaxCount < 0)
+ throw new ArgumentOutOfRangeException(nameof(option.MaxCount), option.MaxCount, "MaxCount must be greater than or equal to 0");
+
+ await _semaphore.WaitAsync(token);
+
+
+ try
+ {
+ if (token.IsCancellationRequested)
+ yield break;
+
+ if (option.Keyword.StartsWith("@"))
+ {
+ EverythingApiDllImport.Everything_SetRegex(true);
+ option.Keyword = option.Keyword[1..];
+ }
+
+ var builder = new StringBuilder();
+ builder.Append(option.Keyword);
+
+ if (!string.IsNullOrWhiteSpace(option.ParentPath))
+ {
+ builder.Append($" {(option.IsRecursive ? "" : "parent:")}\"{option.ParentPath}\"");
+ }
+
+ if (option.IsContentSearch)
+ {
+ builder.Append($" content:\"{option.ContentSearchKeyword}\"");
+ }
+
+ EverythingApiDllImport.Everything_SetSearchW(builder.ToString());
+ EverythingApiDllImport.Everything_SetOffset(option.Offset);
+ EverythingApiDllImport.Everything_SetMax(option.MaxCount);
+
+ EverythingApiDllImport.Everything_SetSort(option.SortOption);
+ EverythingApiDllImport.Everything_SetMatchPath(option.IsFullPathSearch);
+
+ if (option.SortOption == SortOption.RUN_COUNT_DESCENDING)
+ {
+ EverythingApiDllImport.Everything_SetRequestFlags(EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME | EVERYTHING_REQUEST_RUN_COUNT);
+ }
+ else
+ {
+ EverythingApiDllImport.Everything_SetRequestFlags(EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME);
+ }
+
+
+
+ if (token.IsCancellationRequested) yield break;
+
+ if (!EverythingApiDllImport.Everything_QueryW(true))
+ {
+ CheckAndThrowExceptionOnError();
+ yield break;
+ }
+
+ for (var idx = 0; idx < EverythingApiDllImport.Everything_GetNumResults(); ++idx)
+ {
+ if (token.IsCancellationRequested)
+ {
+ yield break;
+ }
+
+ EverythingApiDllImport.Everything_GetResultFullPathNameW(idx, buffer, BufferSize);
+
+ var result = new SearchResult
+ {
+ // todo the types are wrong. Everything expects uint everywhere, but we send int just above/below. how to fix? Is EverythingApiDllImport autogenerated or handmade?
+ FullPath = buffer.ToString(),
+ Type = EverythingApiDllImport.Everything_IsFolderResult(idx) ? ResultType.Folder :
+ EverythingApiDllImport.Everything_IsFileResult(idx) ? ResultType.File :
+ ResultType.Volume,
+ Score = (int)EverythingApiDllImport.Everything_GetResultRunCount( (uint)idx)
+ };
+
+ yield return result;
+ }
+ }
+ finally
+ {
+ EverythingApiDllImport.Everything_Reset();
+ _semaphore.Release();
+ }
+ }
+
+ private static void CheckAndThrowExceptionOnError()
+ {
+ switch (EverythingApiDllImport.Everything_GetLastError())
+ {
+ case StateCode.CreateThreadError:
+ throw new CreateThreadException();
+ case StateCode.CreateWindowError:
+ throw new CreateWindowException();
+ case StateCode.InvalidCallError:
+ throw new InvalidCallException();
+ case StateCode.InvalidIndexError:
+ throw new InvalidIndexException();
+ case StateCode.IPCError:
+ throw new IPCErrorException();
+ case StateCode.MemoryError:
+ throw new MemoryErrorException();
+ case StateCode.RegisterClassExError:
+ throw new RegisterClassExException();
+ case StateCode.OK:
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+
+ public static async Task IncrementRunCounterAsync(string fileOrFolder)
+ {
+ await _semaphore.WaitAsync(TimeSpan.FromSeconds(1));
+ try
+ {
+ _ = EverythingApiDllImport.Everything_IncRunCountFromFileName(fileOrFolder);
+ }
+ catch (Exception)
+ {
+ /*ignored*/
+ }
+ finally { _semaphore.Release(); }
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs
new file mode 100644
index 000000000..5b80819fa
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs
@@ -0,0 +1,163 @@
+using Flow.Launcher.Plugin.Everything.Everything;
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
+{
+ public static class EverythingApiDllImport
+ {
+ public static void Load(string directory)
+ {
+ var path = Path.Combine(directory, DLL);
+ int code = LoadLibrary(path);
+ if (code == 0)
+ {
+ int err = Marshal.GetLastPInvokeError();
+ Marshal.ThrowExceptionForHR(err);
+ }
+ }
+
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+ private static extern int LoadLibrary(string name);
+
+ private const string DLL = "Everything.dll";
+
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ internal static extern int Everything_SetSearchW(string lpSearchString);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetMatchPath(bool bEnable);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetMatchCase(bool bEnable);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetMatchWholeWord(bool bEnable);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetRegex(bool bEnable);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetMax(int dwMax);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SetOffset(int dwOffset);
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_GetMatchPath();
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_GetMatchCase();
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_GetMatchWholeWord();
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_GetRegex();
+
+ [DllImport(DLL)]
+ internal static extern uint Everything_GetMax();
+
+ [DllImport(DLL)]
+ internal static extern uint Everything_GetOffset();
+
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ internal static extern string Everything_GetSearchW();
+
+ [DllImport(DLL)]
+ internal static extern EverythingApi.StateCode Everything_GetLastError();
+
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ internal static extern bool Everything_QueryW(bool bWait);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_SortResultsByPath();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetNumFileResults();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetMajorVersion();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetNumFolderResults();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetNumResults();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetTotFileResults();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetTotFolderResults();
+
+ [DllImport(DLL)]
+ internal static extern int Everything_GetTotResults();
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_IsVolumeResult(int nIndex);
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_IsFolderResult(int nIndex);
+
+ [DllImport(DLL)]
+ internal static extern bool Everything_IsFileResult(int nIndex);
+
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ internal static extern void Everything_GetResultFullPathNameW(int nIndex, StringBuilder lpString, int nMaxCount);
+
+ [DllImport(DLL)]
+ internal static extern void Everything_Reset();
+
+ // Everything 1.4
+
+ [DllImport(DLL)]
+ public static extern void Everything_SetSort(SortOption dwSortType);
+ [DllImport(DLL)]
+ public static extern bool Everything_IsFastSort(SortOption dwSortType);
+ [DllImport(DLL)]
+ public static extern SortOption Everything_GetSort();
+ [DllImport(DLL)]
+ public static extern uint Everything_GetResultListSort();
+ [DllImport(DLL)]
+ public static extern void Everything_SetRequestFlags(uint dwRequestFlags);
+ [DllImport(DLL)]
+ public static extern uint Everything_GetRequestFlags();
+ [DllImport(DLL)]
+ public static extern uint Everything_GetResultListRequestFlags();
+ [DllImport("Everything64.dll", CharSet = CharSet.Unicode)]
+ public static extern IntPtr Everything_GetResultExtension(uint nIndex);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultSize(uint nIndex, out long lpFileSize);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultDateCreated(uint nIndex, out long lpFileTime);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultDateModified(uint nIndex, out long lpFileTime);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultDateAccessed(uint nIndex, out long lpFileTime);
+ [DllImport(DLL)]
+ public static extern uint Everything_GetResultAttributes(uint nIndex);
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ public static extern IntPtr Everything_GetResultFileListFileName(uint nIndex);
+ [DllImport(DLL)]
+ public static extern uint Everything_GetResultRunCount(uint nIndex);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultDateRun(uint nIndex, out long lpFileTime);
+ [DllImport(DLL)]
+ public static extern bool Everything_GetResultDateRecentlyChanged(uint nIndex, out long lpFileTime);
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ public static extern IntPtr Everything_GetResultHighlightedFileName(uint nIndex);
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ public static extern IntPtr Everything_GetResultHighlightedPath(uint nIndex);
+ [DllImport(DLL, CharSet = CharSet.Unicode)]
+ public static extern IntPtr Everything_GetResultHighlightedFullPathAndFileName(uint nIndex);
+ [DllImport(DLL)]
+ public static extern uint Everything_GetRunCountFromFileName(string lpFileName);
+ [DllImport(DLL)]
+ public static extern bool Everything_SetRunCountFromFileName(string lpFileName, uint dwRunCount);
+ [DllImport(DLL)]
+ public static extern uint Everything_IncRunCountFromFileName(string lpFileName);
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingDownloadHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingDownloadHelper.cs
new file mode 100644
index 000000000..ce774281c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingDownloadHelper.cs
@@ -0,0 +1,88 @@
+using Droplex;
+using Flow.Launcher.Plugin.SharedCommands;
+using Microsoft.Win32;
+using System;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything;
+
+public static class EverythingDownloadHelper
+{
+ public static async Task PromptDownloadIfNotInstallAsync(string installedLocation, IPublicAPI api)
+ {
+ if (!string.IsNullOrEmpty(installedLocation) && installedLocation.FileExists())
+ return installedLocation;
+
+ installedLocation = GetInstalledPath();
+
+ if (string.IsNullOrEmpty(installedLocation))
+ {
+ if (System.Windows.Forms.MessageBox.Show(
+ string.Format(api.GetTranslation("flowlauncher_plugin_everything_installing_select"), Environment.NewLine),
+ api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
+ System.Windows.Forms.MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
+ {
+ var dlg = new System.Windows.Forms.OpenFileDialog
+ {
+ InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
+ };
+
+ var result = dlg.ShowDialog();
+ if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrEmpty(dlg.FileName))
+ installedLocation = dlg.FileName;
+ }
+ }
+
+ if (!string.IsNullOrEmpty(installedLocation))
+ {
+ return installedLocation;
+ }
+
+ api.ShowMsg(api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
+ api.GetTranslation("flowlauncher_plugin_everything_installing_subtitle"), "", useMainWindowAsOwner: false);
+
+ await DroplexPackage.Drop(App.Everything1_4_1_1009).ConfigureAwait(false);
+
+ api.ShowMsg(api.GetTranslation("flowlauncher_plugin_everything_installing_title"),
+ api.GetTranslation("flowlauncher_plugin_everything_installationsuccess_subtitle"), "", useMainWindowAsOwner: false);
+
+ installedLocation = "C:\\Program Files\\Everything\\Everything.exe";
+
+ FilesFolders.OpenPath(installedLocation);
+
+ return installedLocation;
+
+ }
+
+ internal static string GetInstalledPath()
+ {
+ using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
+ if (key is not null)
+ {
+ foreach (var subKey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
+ {
+ if (subKey?.GetValue("DisplayName") is not string displayName || !displayName.Contains("Everything"))
+ {
+ continue;
+ }
+ if (subKey.GetValue("UninstallString") is not string uninstallString)
+ {
+ continue;
+ }
+
+ if (Path.GetDirectoryName(uninstallString) is not { } uninstallDirectory)
+ {
+ continue;
+ }
+ return Path.Combine(uninstallDirectory, "Everything.exe");
+ }
+ }
+
+ var scoopInstalledPath = Environment.ExpandEnvironmentVariables(@"%userprofile%\scoop\apps\everything\current\Everything.exe");
+ return File.Exists(scoopInstalledPath) ? scoopInstalledPath : string.Empty;
+
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
new file mode 100644
index 000000000..1ea23777c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
+using Flow.Launcher.Plugin.Explorer.Search.IProvider;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
+{
+ public class EverythingSearchManager : IIndexProvider, IContentIndexProvider, IPathIndexProvider
+ {
+ private Settings Settings { get; }
+
+ public EverythingSearchManager(Settings settings)
+ {
+ Settings = settings;
+ }
+
+ private async ValueTask ThrowIfEverythingNotAvailableAsync(CancellationToken token = default)
+ {
+ try
+ {
+ if (!await EverythingApi.IsEverythingRunningAsync(token))
+ throw new EngineNotAvailableException(
+ Enum.GetName(Settings.IndexSearchEngineOption.Everything)!,
+ Main.Context.API.GetTranslation("flowlauncher_plugin_everything_click_to_launch_or_install"),
+ Main.Context.API.GetTranslation("flowlauncher_plugin_everything_is_not_running"),
+ Constants.EverythingErrorImagePath,
+ ClickToInstallEverythingAsync);
+ }
+ catch (DllNotFoundException)
+ {
+ throw new EngineNotAvailableException(
+ Enum.GetName(Settings.IndexSearchEngineOption.Everything)!,
+ "Please check whether your system is x86 or x64",
+ Constants.GeneralSearchErrorImagePath,
+ Main.Context.API.GetTranslation("flowlauncher_plugin_everything_sdk_issue"));
+ }
+ }
+
+ private async ValueTask ClickToInstallEverythingAsync(ActionContext _)
+ {
+ var installedPath = await EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, Main.Context.API);
+
+ if (installedPath == null)
+ {
+ Main.Context.API.ShowMsgError("Unable to find Everything.exe");
+
+ return false;
+ }
+
+ Settings.EverythingInstalledPath = installedPath;
+ Process.Start(installedPath, "-startup");
+
+ return true;
+ }
+
+ public async IAsyncEnumerable SearchAsync(string search, [EnumeratorCancellation] CancellationToken token)
+ {
+ await ThrowIfEverythingNotAvailableAsync(token);
+
+ if (token.IsCancellationRequested)
+ yield break;
+
+ var option = new EverythingSearchOption(search, Settings.SortOption, IsFullPathSearch: Settings.EverythingSearchFullPath);
+
+ await foreach (var result in EverythingApi.SearchAsync(option, token))
+ yield return result;
+ }
+
+ public async IAsyncEnumerable ContentSearchAsync(string plainSearch, string contentSearch,
+ [EnumeratorCancellation] CancellationToken token)
+ {
+ await ThrowIfEverythingNotAvailableAsync(token);
+
+ if (!Settings.EnableEverythingContentSearch)
+ {
+ throw new EngineNotAvailableException(Enum.GetName(Settings.IndexSearchEngineOption.Everything)!,
+ Main.Context.API.GetTranslation("flowlauncher_plugin_everything_enable_content_search"),
+ Main.Context.API.GetTranslation("flowlauncher_plugin_everything_enable_content_search_tips"),
+ Constants.EverythingErrorImagePath,
+ _ =>
+ {
+ Settings.EnableEverythingContentSearch = true;
+
+ return ValueTask.FromResult(true);
+ });
+ }
+
+ if (token.IsCancellationRequested)
+ yield break;
+
+ var option = new EverythingSearchOption(plainSearch,
+ Settings.SortOption,
+ true,
+ contentSearch,
+ IsFullPathSearch: Settings.EverythingSearchFullPath);
+
+ await foreach (var result in EverythingApi.SearchAsync(option, token))
+ {
+ yield return result;
+ }
+ }
+
+ public async IAsyncEnumerable EnumerateAsync(string path, string search, bool recursive, [EnumeratorCancellation] CancellationToken token)
+ {
+ await ThrowIfEverythingNotAvailableAsync(token);
+
+ if (token.IsCancellationRequested)
+ yield break;
+
+ var option = new EverythingSearchOption(search,
+ Settings.SortOption,
+ ParentPath: path,
+ IsRecursive: recursive,
+ IsFullPathSearch: Settings.EverythingSearchFullPath);
+
+ await foreach (var result in EverythingApi.SearchAsync(option, token))
+ {
+ yield return result;
+ }
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs
new file mode 100644
index 000000000..0b1bbd0ec
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs
@@ -0,0 +1,17 @@
+using System;
+using Flow.Launcher.Plugin.Everything.Everything;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
+{
+ public record struct EverythingSearchOption(
+ string Keyword,
+ SortOption SortOption,
+ bool IsContentSearch = false,
+ string ContentSearchKeyword = default,
+ string ParentPath = default,
+ bool IsRecursive = true,
+ int Offset = 0,
+ int MaxCount = 100,
+ bool IsFullPathSearch = true
+ );
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateThreadException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateThreadException.cs
new file mode 100644
index 000000000..32163057b
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateThreadException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class CreateThreadException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateWindowException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateWindowException.cs
new file mode 100644
index 000000000..9704226d7
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/CreateWindowException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class CreateWindowException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/IPCErrorException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/IPCErrorException.cs
new file mode 100644
index 000000000..41629d2e4
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/IPCErrorException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class IPCErrorException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidCallException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidCallException.cs
new file mode 100644
index 000000000..f84dc1ab8
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidCallException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class InvalidCallException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidIndexException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidIndexException.cs
new file mode 100644
index 000000000..cbf75e5a3
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/InvalidIndexException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class InvalidIndexException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/MemoryErrorException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/MemoryErrorException.cs
new file mode 100644
index 000000000..c632cd530
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/MemoryErrorException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class MemoryErrorException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/RegisterClassExException.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/RegisterClassExException.cs
new file mode 100644
index 000000000..2ebdbb689
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/Exceptions/RegisterClassExException.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions
+{
+ ///
+ ///
+ ///
+ public class RegisterClassExException : ApplicationException
+ {
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/SortOption.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/SortOption.cs
new file mode 100644
index 000000000..c57e3fe4a
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/SortOption.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flow.Launcher.Plugin.Everything.Everything
+{
+ public enum SortOption : uint
+ {
+ NAME_ASCENDING = 1u,
+ NAME_DESCENDING = 2u,
+ PATH_ASCENDING = 3u,
+ PATH_DESCENDING = 4u,
+ SIZE_ASCENDING = 5u,
+ SIZE_DESCENDING = 6u,
+ EXTENSION_ASCENDING = 7u,
+ EXTENSION_DESCENDING = 8u,
+ TYPE_NAME_ASCENDING = 9u,
+ TYPE_NAME_DESCENDING = 10u,
+ DATE_CREATED_ASCENDING = 11u,
+ DATE_CREATED_DESCENDING = 12u,
+ DATE_MODIFIED_ASCENDING = 13u,
+ DATE_MODIFIED_DESCENDING = 14u,
+ ATTRIBUTES_ASCENDING = 15u,
+ ATTRIBUTES_DESCENDING = 16u,
+ FILE_LIST_FILENAME_ASCENDING = 17u,
+ FILE_LIST_FILENAME_DESCENDING = 18u,
+ RUN_COUNT_DESCENDING = 20u,
+ DATE_RECENTLY_CHANGED_ASCENDING = 21u,
+ DATE_RECENTLY_CHANGED_DESCENDING = 22u,
+ DATE_ACCESSED_ASCENDING = 23u,
+ DATE_ACCESSED_DESCENDING = 24u,
+ DATE_RUN_ASCENDING = 25u,
+ DATE_RUN_DESCENDING = 26u
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IContentIndexProvider.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IContentIndexProvider.cs
new file mode 100644
index 000000000..6e036e058
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IContentIndexProvider.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.IProvider
+{
+ public interface IContentIndexProvider
+ {
+ public IAsyncEnumerable ContentSearchAsync(string plainSearch, string contentSearch, CancellationToken token = default);
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IIndexProvider.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IIndexProvider.cs
new file mode 100644
index 000000000..d43dd7df3
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IIndexProvider.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.IProvider
+{
+ public interface IIndexProvider
+ {
+ public IAsyncEnumerable SearchAsync(string search, CancellationToken token);
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IPathIndexProvider.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IPathIndexProvider.cs
new file mode 100644
index 000000000..4622df5f9
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/IProvider/IPathIndexProvider.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.IProvider
+{
+ public interface IPathIndexProvider
+ {
+ public IAsyncEnumerable EnumerateAsync(string path, string search, bool recursive, CancellationToken token);
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
index 0e4465b45..1975211f9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
{
get
{
- var path = Path.EndsWith(Constants.DirectorySeperator) ? Path[0..^1] : Path;
+ var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path;
if (path.EndsWith(':'))
return path[0..^1] + " Drive";
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
index 55975c2a5..cdd2c93e6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
@@ -8,7 +8,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
{
private const int quickAccessResultScore = 100;
- internal static List AccessLinkListMatched(Query query, List accessLinks)
+ internal static List AccessLinkListMatched(Query query, IEnumerable accessLinks)
{
if (string.IsNullOrEmpty(query.Search))
return new List();
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
var queriedAccessLinks =
accessLinks
- .Where(x => x.Name.Contains(search, StringComparison.OrdinalIgnoreCase))
+ .Where(x => x.Name.Contains(search, StringComparison.OrdinalIgnoreCase) || x.Path.Contains(search, StringComparison.OrdinalIgnoreCase))
.OrderBy(x => x.Type)
.ThenBy(x => x.Name);
@@ -29,7 +29,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
}).ToList();
}
- internal static List AccessLinkListAll(Query query, List accessLinks)
+ internal static List AccessLinkListAll(Query query, IEnumerable accessLinks)
=> accessLinks
.OrderBy(x => x.Type)
.ThenBy(x => x.Name)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index 63310bebd..83c173ac6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -1,4 +1,5 @@
-using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Diagnostics;
@@ -6,6 +7,8 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
+using System.Windows.Input;
namespace Flow.Launcher.Plugin.Explorer.Search
{
@@ -20,186 +23,290 @@ namespace Flow.Launcher.Plugin.Explorer.Search
Settings = settings;
}
- private static string GetPathWithActionKeyword(string path, ResultType type)
+ public static string GetPathWithActionKeyword(string path, ResultType type, string actionKeyword)
{
- // one of it is enabled
- var keyword = Settings.SearchActionKeywordEnabled ? Settings.SearchActionKeyword : Settings.PathSearchActionKeyword;
+ // actionKeyword will be empty string if using global, query.ActionKeyword is ""
- keyword = keyword == Query.GlobalPluginWildcardSign ? string.Empty : keyword + " ";
+ var usePathSearchActionKeyword = Settings.PathSearchKeywordEnabled && !Settings.SearchActionKeywordEnabled;
- var formatted_path = path;
+ var pathSearchActionKeyword = Settings.PathSearchActionKeyword == Query.GlobalPluginWildcardSign
+ ? string.Empty
+ : $"{Settings.PathSearchActionKeyword} ";
+
+ var searchActionKeyword = Settings.SearchActionKeyword == Query.GlobalPluginWildcardSign
+ ? string.Empty
+ : $"{Settings.SearchActionKeyword} ";
+
+ var keyword = usePathSearchActionKeyword ? pathSearchActionKeyword : searchActionKeyword;
+
+ var formattedPath = path;
if (type == ResultType.Folder)
- formatted_path = path.EndsWith(Constants.DirectorySeperator) ? path : path + Constants.DirectorySeperator;
+ // the separator is needed so when navigating the folder structure contents of the folder are listed
+ formattedPath = path.EndsWith(Constants.DirectorySeparator) ? path : path + Constants.DirectorySeparator;
- return $"{keyword}{formatted_path}";
+ return $"{keyword}{formattedPath}";
}
- internal static Result CreateFolderResult(string title, string subtitle, string path, Query query, int score = 0, bool showIndexState = false, bool windowsIndexed = false)
+ public static string GetAutoCompleteText(string title, Query query, string path, ResultType resultType)
+ {
+ return !Settings.PathSearchKeywordEnabled && !Settings.SearchActionKeywordEnabled
+ ? $"{query.ActionKeyword} {title}" // Only Quick Access action keyword is used in this scenario
+ : GetPathWithActionKeyword(path, resultType, query.ActionKeyword);
+ }
+
+ public static Result CreateResult(Query query, SearchResult result)
+ {
+ return result.Type switch
+ {
+ ResultType.Folder or ResultType.Volume =>
+ CreateFolderResult(Path.GetFileName(result.FullPath), result.FullPath, result.FullPath, query, result.Score, result.WindowsIndexed),
+ ResultType.File =>
+ CreateFileResult(result.FullPath, query, result.Score, result.WindowsIndexed),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+ }
+
+ internal static Result CreateFolderResult(string title, string subtitle, string path, Query query, int score = 0, bool windowsIndexed = false)
{
return new Result
{
Title = title,
IcoPath = path,
SubTitle = subtitle,
- AutoCompleteText = GetPathWithActionKeyword(path, ResultType.Folder),
+ AutoCompleteText = GetAutoCompleteText(title, query, path, ResultType.Folder),
TitleHighlightData = StringMatcher.FuzzySearch(query.Search, title).MatchData,
+ CopyText = path,
Action = c =>
{
- if (c.SpecialKeyState.CtrlPressed || (!Settings.PathSearchKeywordEnabled && !Settings.SearchActionKeywordEnabled))
+ // open folder
+ if (c.SpecialKeyState.ToModifierKeys() == (ModifierKeys.Control | ModifierKeys.Shift))
{
try
{
- Context.API.OpenDirectory(path);
+ OpenFolder(path);
return true;
}
catch (Exception ex)
{
- MessageBox.Show(ex.Message, "Could not start " + path);
+ MessageBox.Show(ex.Message, Context.API.GetTranslation("plugin_explorer_opendir_error"));
+ return false;
+ }
+ }
+ // Open containing folder
+ if (c.SpecialKeyState.ToModifierKeys() == ModifierKeys.Control)
+ {
+ try
+ {
+ Context.API.OpenDirectory(Path.GetDirectoryName(path), path);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, Context.API.GetTranslation("plugin_explorer_opendir_error"));
return false;
}
}
- Context.API.ChangeQuery(GetPathWithActionKeyword(path, ResultType.Folder));
-
+ // If path search is disabled just open it in file manager
+ if (Settings.DefaultOpenFolderInFileManager || (!Settings.PathSearchKeywordEnabled && !Settings.SearchActionKeywordEnabled))
+ {
+ try
+ {
+ OpenFolder(path);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, Context.API.GetTranslation("plugin_explorer_opendir_error"));
+ return false;
+ }
+ }
+ else
+ {
+ // or make this folder the current query
+ Context.API.ChangeQuery(GetPathWithActionKeyword(path, ResultType.Folder, query.ActionKeyword));
+ }
+
return false;
},
Score = score,
- TitleToolTip = Constants.ToolTipOpenDirectory,
+ TitleToolTip = InternationalizationManager.Instance.GetTranslation("plugin_explorer_plugin_ToolTipOpenDirectory"),
SubTitleToolTip = path,
- ContextData = new SearchResult
- {
- Type = ResultType.Folder,
- FullPath = path,
- ShowIndexState = showIndexState,
- WindowsIndexed = windowsIndexed
- }
+ ContextData = new SearchResult { Type = ResultType.Folder, FullPath = path, WindowsIndexed = windowsIndexed }
};
}
- internal static Result CreateOpenCurrentFolderResult(string path, bool windowsIndexed = false)
+ internal static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, bool windowsIndexed = false)
{
- var retrievedDirectoryPath = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(path);
+ var progressBarColor = "#26a0da";
+ var title = string.Empty; // hide title when use progress bar,
+ var driveLetter = path[..1].ToUpper();
+ DriveInfo drv = new DriveInfo(driveLetter);
+ var freespace = ToReadableSize(drv.AvailableFreeSpace, 2);
+ var totalspace = ToReadableSize(drv.TotalSize, 2);
+ var subtitle = string.Format(Context.API.GetTranslation("plugin_explorer_diskfreespace"), freespace, totalspace);
+ double usingSize = (Convert.ToDouble(drv.TotalSize) - Convert.ToDouble(drv.AvailableFreeSpace)) / Convert.ToDouble(drv.TotalSize) * 100;
- var folderName = retrievedDirectoryPath.TrimEnd(Constants.DirectorySeperator).Split(new[]
- {
- Path.DirectorySeparatorChar
- }, StringSplitOptions.None).Last();
+ int? progressValue = Convert.ToInt32(usingSize);
- if (retrievedDirectoryPath.EndsWith(":\\"))
- {
- var driveLetter = path.Substring(0, 1).ToUpper();
- folderName = driveLetter + " drive";
- }
-
- var title = "Open current directory";
-
- if (retrievedDirectoryPath != path)
- title = "Open " + folderName;
-
-
- var subtitleFolderName = folderName;
-
- // ie. max characters can be displayed without subtitle cutting off: "Program Files (x86)"
- if (folderName.Length > 19)
- subtitleFolderName = "the directory";
+ if (progressValue >= 90)
+ progressBarColor = "#da2626";
return new Result
{
Title = title,
- SubTitle = $"Use > to search within {subtitleFolderName}, " +
- $"* to search for file extensions or >* to combine both searches.",
- AutoCompleteText = GetPathWithActionKeyword(retrievedDirectoryPath, ResultType.Folder),
- IcoPath = retrievedDirectoryPath,
+ SubTitle = subtitle,
+ AutoCompleteText = GetPathWithActionKeyword(path, ResultType.Folder, actionKeyword),
+ IcoPath = path,
Score = 500,
- Action = c =>
+ ProgressBar = progressValue,
+ ProgressBarColor = progressBarColor,
+ Action = _ =>
{
- Context.API.OpenDirectory(retrievedDirectoryPath);
+ OpenFolder(path);
return true;
},
- TitleToolTip = retrievedDirectoryPath,
- SubTitleToolTip = retrievedDirectoryPath,
- ContextData = new SearchResult
- {
- Type = ResultType.Folder,
- FullPath = retrievedDirectoryPath,
- ShowIndexState = true,
- WindowsIndexed = windowsIndexed
- }
+ TitleToolTip = path,
+ SubTitleToolTip = path,
+ ContextData = new SearchResult { Type = ResultType.Volume, FullPath = path, WindowsIndexed = windowsIndexed }
};
}
- internal static Result CreateFileResult(string filePath, Query query, int score = 0, bool showIndexState = false, bool windowsIndexed = false)
+ private static string ToReadableSize(long pDrvSize, int pi)
{
+ int mok = 0;
+ double drvSize = pDrvSize;
+ string uom = "Byte"; // Unit Of Measurement
+
+ while (drvSize > 1024.0)
+ {
+ drvSize /= 1024.0;
+ mok++;
+ }
+
+ if (mok == 1)
+ uom = "KB";
+ else if (mok == 2)
+ uom = " MB";
+ else if (mok == 3)
+ uom = " GB";
+ else if (mok == 4)
+ uom = " TB";
+
+ var returnStr = $"{Convert.ToInt32(drvSize)}{uom}";
+ if (mok != 0)
+ {
+ returnStr = pi switch
+ {
+ 1 => $"{drvSize:F1}{uom}",
+ 2 => $"{drvSize:F2}{uom}",
+ 3 => $"{drvSize:F3}{uom}",
+ _ => $"{Convert.ToInt32(drvSize)}{uom}"
+ };
+ }
+
+ return returnStr;
+ }
+
+ internal static Result CreateOpenCurrentFolderResult(string path, string actionKeyword, bool windowsIndexed = false)
+ {
+ // Path passed from PathSearchAsync ends with Constants.DirectorySeparator ('\'), need to remove the separator
+ // so it's consistent with folder results returned by index search which does not end with one
+ var folderPath = path.TrimEnd(Constants.DirectorySeparator);
+
+ return new Result
+ {
+ Title = Context.API.GetTranslation("plugin_explorer_openresultfolder"),
+ SubTitle = Context.API.GetTranslation("plugin_explorer_openresultfolder_subtitle"),
+ AutoCompleteText = GetPathWithActionKeyword(folderPath, ResultType.Folder, actionKeyword),
+ IcoPath = folderPath,
+ Score = 500,
+ CopyText = folderPath,
+ Action = _ =>
+ {
+ OpenFolder(folderPath);
+ return true;
+ },
+ ContextData = new SearchResult { Type = ResultType.Folder, FullPath = folderPath, WindowsIndexed = windowsIndexed }
+ };
+ }
+
+ internal static Result CreateFileResult(string filePath, Query query, int score = 0, bool windowsIndexed = false)
+ {
+ Result.PreviewInfo preview = IsMedia(Path.GetExtension(filePath))
+ ? new Result.PreviewInfo { IsMedia = true, PreviewImagePath = filePath, }
+ : Result.PreviewInfo.Default;
+
+ var title = Path.GetFileName(filePath);
+
var result = new Result
{
- Title = Path.GetFileName(filePath),
- SubTitle = filePath,
+ Title = title,
+ SubTitle = Path.GetDirectoryName(filePath),
IcoPath = filePath,
- AutoCompleteText = GetPathWithActionKeyword(filePath, ResultType.File),
- TitleHighlightData = StringMatcher.FuzzySearch(query.Search, Path.GetFileName(filePath)).MatchData,
+ Preview = preview,
+ AutoCompleteText = GetAutoCompleteText(title, query, filePath, ResultType.File),
+ TitleHighlightData = StringMatcher.FuzzySearch(query.Search, title).MatchData,
Score = score,
+ CopyText = filePath,
Action = c =>
{
try
{
- if (File.Exists(filePath) && c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed)
+ if (c.SpecialKeyState.ToModifierKeys() == (ModifierKeys.Control | ModifierKeys.Shift))
{
- Task.Run(() =>
- {
- try
- {
- Process.Start(new ProcessStartInfo
- {
- FileName = filePath,
- UseShellExecute = true,
- Verb = "runas",
- });
- }
- catch (Exception e)
- {
- MessageBox.Show(e.Message, "Could not start " + filePath);
- }
- });
+ OpenFile(filePath, Settings.UseLocationAsWorkingDir ? Path.GetDirectoryName(filePath) : string.Empty, true);
}
- else if (c.SpecialKeyState.CtrlPressed)
+ else if (c.SpecialKeyState.ToModifierKeys() == ModifierKeys.Control)
{
- Context.API.OpenDirectory(Path.GetDirectoryName(filePath), filePath);
+ OpenFolder(filePath, filePath);
}
else
{
- FilesFolders.OpenPath(filePath);
+ OpenFile(filePath, Settings.UseLocationAsWorkingDir ? Path.GetDirectoryName(filePath) : string.Empty);
}
}
catch (Exception ex)
{
- MessageBox.Show(ex.Message, "Could not start " + filePath);
+ MessageBox.Show(ex.Message, Context.API.GetTranslation("plugin_explorer_openfile_error"));
}
return true;
},
- TitleToolTip = Constants.ToolTipOpenContainingFolder,
+ TitleToolTip = InternationalizationManager.Instance.GetTranslation("plugin_explorer_plugin_ToolTipOpenContainingFolder"),
SubTitleToolTip = filePath,
- ContextData = new SearchResult
- {
- Type = ResultType.File,
- FullPath = filePath,
- ShowIndexState = showIndexState,
- WindowsIndexed = windowsIndexed
- }
+ ContextData = new SearchResult { Type = ResultType.File, FullPath = filePath, WindowsIndexed = windowsIndexed }
};
return result;
}
- }
- internal class SearchResult
- {
- public string FullPath { get; set; }
- public ResultType Type { get; set; }
+ private static bool IsMedia(string extension)
+ {
+ if (string.IsNullOrEmpty(extension)) { return false; }
- public bool WindowsIndexed { get; set; }
+ return MediaExtensions.Contains(extension.ToLowerInvariant());
+ }
- public bool ShowIndexState { get; set; }
+ private static void OpenFile(string filePath, string workingDir = "", bool asAdmin = false)
+ {
+ IncrementEverythingRunCounterIfNeeded(filePath);
+ FilesFolders.OpenFile(filePath, workingDir, asAdmin);
+ }
+
+ private static void OpenFolder(string folderPath, string fileNameOrFilePath = null)
+ {
+ IncrementEverythingRunCounterIfNeeded(folderPath);
+ Context.API.OpenDirectory(folderPath, fileNameOrFilePath);
+ }
+
+ private static void IncrementEverythingRunCounterIfNeeded(string fileOrFolder)
+ {
+ if (Settings.EverythingEnabled)
+ _ = Task.Run(() => EverythingApi.IncrementRunCounterAsync(fileOrFolder));
+ }
+
+ private static readonly string[] MediaExtensions = { ".jpg", ".png", ".avi", ".mkv", ".bmp", ".gif", ".wmv", ".mp3", ".flac", ".mp4" };
}
public enum ResultType
@@ -208,4 +315,4 @@ namespace Flow.Launcher.Plugin.Explorer.Search
Folder,
File
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
index 8ce627a44..51c4c3d9d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
@@ -1,20 +1,21 @@
using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
-using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
namespace Flow.Launcher.Plugin.Explorer.Search
{
public class SearchManager
{
- internal static PluginInitContext Context;
+ internal PluginInitContext Context;
- internal static Settings Settings;
+ internal Settings Settings;
public SearchManager(Settings settings, PluginInitContext context)
{
@@ -22,59 +23,108 @@ namespace Flow.Launcher.Plugin.Explorer.Search
Settings = settings;
}
- private class PathEqualityComparator : IEqualityComparer
+ ///
+ /// Note: A path that ends with "\" and one that doesn't will not be regarded as equal.
+ ///
+ public class PathEqualityComparator : IEqualityComparer
{
private static PathEqualityComparator instance;
public static PathEqualityComparator Instance => instance ??= new PathEqualityComparator();
public bool Equals(Result x, Result y)
{
- return x.SubTitle == y.SubTitle;
+ return x.Title.Equals(y.Title, StringComparison.OrdinalIgnoreCase)
+ && string.Equals(x.SubTitle, y.SubTitle, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(Result obj)
{
- return obj.SubTitle.GetHashCode();
+ return HashCode.Combine(obj.Title.ToLowerInvariant(), obj.SubTitle?.ToLowerInvariant() ?? "");
}
}
internal async Task> SearchAsync(Query query, CancellationToken token)
{
- var querySearch = query.Search;
-
var results = new HashSet(PathEqualityComparator.Instance);
// This allows the user to type the below action keywords and see/search the list of quick folder links
if (ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.QuickAccessActionKeyword)
- || ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword))
+ || ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword)
+ || ActionKeywordMatch(query, Settings.ActionKeyword.IndexSearchActionKeyword)
+ || ActionKeywordMatch(query, Settings.ActionKeyword.FileContentSearchActionKeyword))
{
- if (string.IsNullOrEmpty(query.Search))
+ if (string.IsNullOrEmpty(query.Search) && ActionKeywordMatch(query, Settings.ActionKeyword.QuickAccessActionKeyword))
return QuickAccess.AccessLinkListAll(query, Settings.QuickAccessLinks);
- var quickaccessLinks = QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks);
+ var quickAccessLinks = QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks);
- results.UnionWith(quickaccessLinks);
+ results.UnionWith(quickAccessLinks);
}
-
- if (IsFileContentSearch(query.ActionKeyword))
- return await WindowsIndexFileContentSearchAsync(query, querySearch, token).ConfigureAwait(false);
-
- if (ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword) ||
- ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword))
+ else
{
- results.UnionWith(await PathSearchAsync(query, token).ConfigureAwait(false));
+ return new List();
}
- if ((ActionKeywordMatch(query, Settings.ActionKeyword.IndexSearchActionKeyword) ||
- ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword)) &&
- querySearch.Length > 0 &&
- !querySearch.IsLocationPathString())
+ IAsyncEnumerable searchResults;
+
+ bool isPathSearch = query.Search.IsLocationPathString() || IsEnvironmentVariableSearch(query.Search);
+
+ string engineName;
+
+ switch (isPathSearch)
{
- results.UnionWith(await WindowsIndexFilesAndFoldersSearchAsync(query, querySearch, token)
- .ConfigureAwait(false));
+ case true
+ when ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword)
+ || ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword):
+
+ results.UnionWith(await PathSearchAsync(query, token).ConfigureAwait(false));
+
+ return results.ToList();
+
+ case false
+ when ActionKeywordMatch(query, Settings.ActionKeyword.FileContentSearchActionKeyword):
+
+ // Intentionally require enabling of Everything's content search due to its slowness
+ if (Settings.ContentIndexProvider is EverythingSearchManager && !Settings.EnableEverythingContentSearch)
+ return EverythingContentSearchResult(query);
+
+ searchResults = Settings.ContentIndexProvider.ContentSearchAsync("", query.Search, token);
+ engineName = Enum.GetName(Settings.ContentSearchEngine);
+ break;
+
+ case false
+ when ActionKeywordMatch(query, Settings.ActionKeyword.IndexSearchActionKeyword)
+ || ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword):
+
+ searchResults = Settings.IndexProvider.SearchAsync(query.Search, token);
+ engineName = Enum.GetName(Settings.IndexSearchEngine);
+ break;
+ default:
+ return results.ToList();
}
+ try
+ {
+ await foreach (var search in searchResults.WithCancellation(token).ConfigureAwait(false))
+ results.Add(ResultManager.CreateResult(query, search));
+ }
+ catch (OperationCanceledException)
+ {
+ return new List();
+ }
+ catch (EngineNotAvailableException)
+ {
+ throw;
+ }
+ catch (Exception e)
+ {
+ throw new SearchException(engineName, e.Message, e);
+ }
+
+ results.RemoveWhere(r => Settings.IndexSearchExcludedSubdirectoryPaths.Any(
+ excludedPath => FilesFolders.PathContains(excludedPath.Path, r.SubTitle)));
+
return results.ToList();
}
@@ -93,135 +143,114 @@ namespace Flow.Launcher.Plugin.Explorer.Search
Settings.ActionKeyword.IndexSearchActionKeyword => Settings.IndexSearchKeywordEnabled &&
keyword == Settings.IndexSearchActionKeyword,
Settings.ActionKeyword.QuickAccessActionKeyword => Settings.QuickAccessKeywordEnabled &&
- keyword == Settings.QuickAccessActionKeyword
+ keyword == Settings.QuickAccessActionKeyword,
+ _ => throw new ArgumentOutOfRangeException(nameof(allowedActionKeyword), allowedActionKeyword, "actionKeyword out of range")
};
}
- public async Task> PathSearchAsync(Query query, CancellationToken token = default)
+ private List EverythingContentSearchResult(Query query)
+ {
+ return new List()
+ {
+ new()
+ {
+ Title = Context.API.GetTranslation("flowlauncher_plugin_everything_enable_content_search"),
+ SubTitle = Context.API.GetTranslation("flowlauncher_plugin_everything_enable_content_search_tips"),
+ IcoPath = "Images/index_error.png",
+ Action = c =>
+ {
+ Settings.EnableEverythingContentSearch = true;
+ Context.API.ChangeQuery(query.RawQuery, true);
+ return false;
+ }
+ }
+ };
+ }
+
+ private async Task> PathSearchAsync(Query query, CancellationToken token = default)
{
var querySearch = query.Search;
var results = new HashSet(PathEqualityComparator.Instance);
- var isEnvironmentVariable = EnvironmentVariables.IsEnvironmentVariableSearch(querySearch);
-
- if (isEnvironmentVariable)
+ if (EnvironmentVariables.IsEnvironmentVariableSearch(querySearch))
return EnvironmentVariables.GetEnvironmentStringPathSuggestions(querySearch, query, Context);
- // Query is a location path with a full environment variable, eg. %appdata%\somefolder\
- var isEnvironmentVariablePath = querySearch[1..].Contains("%\\");
-
- var locationPath = querySearch;
-
- if (isEnvironmentVariablePath)
- locationPath = EnvironmentVariables.TranslateEnvironmentVariablePath(locationPath);
+ // Query is a location path with a full environment variable, eg. %appdata%\somefolder\, c:\users\%USERNAME%\downloads
+ var needToExpand = EnvironmentVariables.HasEnvironmentVar(querySearch);
+ var locationPath = needToExpand ? Environment.ExpandEnvironmentVariables(querySearch) : querySearch;
// Check that actual location exists, otherwise directory search will throw directory not found exception
- if (!FilesFolders.LocationExists(FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath)))
+ if (!FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath).LocationExists())
return results.ToList();
- var useIndexSearch = UseWindowsIndexForDirectorySearch(locationPath);
+ var useIndexSearch = Settings.IndexSearchEngine is Settings.IndexSearchEngineOption.WindowsIndex
+ && UseWindowsIndexForDirectorySearch(locationPath);
- results.Add(ResultManager.CreateOpenCurrentFolderResult(locationPath, useIndexSearch));
+ var retrievedDirectoryPath = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath);
- token.ThrowIfCancellationRequested();
+ results.Add(retrievedDirectoryPath.EndsWith(":\\")
+ ? ResultManager.CreateDriveSpaceDisplayResult(retrievedDirectoryPath, query.ActionKeyword, useIndexSearch)
+ : ResultManager.CreateOpenCurrentFolderResult(retrievedDirectoryPath, query.ActionKeyword, useIndexSearch));
- var directoryResult = await TopLevelDirectorySearchBehaviourAsync(WindowsIndexTopLevelFolderSearchAsync,
- DirectoryInfoClassSearch,
- useIndexSearch,
- query,
- locationPath,
- token).ConfigureAwait(false);
+ if (token.IsCancellationRequested)
+ return new List();
- token.ThrowIfCancellationRequested();
+ IAsyncEnumerable directoryResult;
+
+ var recursiveIndicatorIndex = query.Search.IndexOf('>');
+
+ if (recursiveIndicatorIndex > 0 && Settings.PathEnumerationEngine != Settings.PathEnumerationEngineOption.DirectEnumeration)
+ {
+ directoryResult =
+ Settings.PathEnumerator.EnumerateAsync(
+ query.Search[..recursiveIndicatorIndex],
+ query.Search[(recursiveIndicatorIndex + 1)..],
+ true,
+ token);
+
+ }
+ else
+ {
+ directoryResult = DirectoryInfoSearch.TopLevelDirectorySearch(query, query.Search, token).ToAsyncEnumerable();
+ }
+
+ if (token.IsCancellationRequested)
+ return new List();
+
+ try
+ {
+ await foreach (var directory in directoryResult.WithCancellation(token).ConfigureAwait(false))
+ {
+ results.Add(ResultManager.CreateResult(query, directory));
+ }
+ }
+ catch (Exception e)
+ {
+ throw new SearchException(Enum.GetName(Settings.PathEnumerationEngine), e.Message, e);
+ }
- results.UnionWith(directoryResult);
return results.ToList();
}
- private async Task> WindowsIndexFileContentSearchAsync(Query query, string querySearchString,
- CancellationToken token)
- {
- var queryConstructor = new QueryConstructor(Settings);
+ public bool IsFileContentSearch(string actionKeyword) => actionKeyword == Settings.FileContentSearchActionKeyword;
- if (string.IsNullOrEmpty(querySearchString))
- return new List();
-
- return await IndexSearch.WindowsIndexSearchAsync(
- querySearchString,
- queryConstructor.CreateQueryHelper,
- queryConstructor.QueryForFileContentSearch,
- Settings.IndexSearchExcludedSubdirectoryPaths,
- query,
- token).ConfigureAwait(false);
- }
-
- public bool IsFileContentSearch(string actionKeyword)
- {
- return actionKeyword == Settings.FileContentSearchActionKeyword;
- }
-
- private List DirectoryInfoClassSearch(Query query, string querySearch, CancellationToken token)
- {
- return DirectoryInfoSearch.TopLevelDirectorySearch(query, querySearch, token);
- }
-
- public async Task> TopLevelDirectorySearchBehaviourAsync(
- Func>> windowsIndexSearch,
- Func> directoryInfoClassSearch,
- bool useIndexSearch,
- Query query,
- string querySearchString,
- CancellationToken token)
- {
- if (!useIndexSearch)
- return directoryInfoClassSearch(query, querySearchString, token);
-
- return await windowsIndexSearch(query, querySearchString, token);
- }
-
- private async Task> WindowsIndexFilesAndFoldersSearchAsync(Query query, string querySearchString,
- CancellationToken token)
- {
- var queryConstructor = new QueryConstructor(Settings);
-
- return await IndexSearch.WindowsIndexSearchAsync(
- querySearchString,
- queryConstructor.CreateQueryHelper,
- queryConstructor.QueryForAllFilesAndFolders,
- Settings.IndexSearchExcludedSubdirectoryPaths,
- query,
- token).ConfigureAwait(false);
- }
-
- private async Task> WindowsIndexTopLevelFolderSearchAsync(Query query, string path,
- CancellationToken token)
- {
- var queryConstructor = new QueryConstructor(Settings);
-
- return await IndexSearch.WindowsIndexSearchAsync(
- path,
- queryConstructor.CreateQueryHelper,
- queryConstructor.QueryForTopLevelDirectorySearch,
- Settings.IndexSearchExcludedSubdirectoryPaths,
- query,
- token).ConfigureAwait(false);
- }
private bool UseWindowsIndexForDirectorySearch(string locationPath)
{
var pathToDirectory = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(locationPath);
- if (!Settings.UseWindowsIndexForDirectorySearch)
- return false;
+ return !Settings.IndexSearchExcludedSubdirectoryPaths.Any(
+ x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory).StartsWith(x.Path, StringComparison.OrdinalIgnoreCase))
+ && WindowsIndex.WindowsIndex.PathIsIndexed(pathToDirectory);
+ }
- if (Settings.IndexSearchExcludedSubdirectoryPaths
- .Any(x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory)
- .StartsWith(x.Path, StringComparison.OrdinalIgnoreCase)))
- return false;
-
- return IndexSearch.PathIsIndexed(pathToDirectory);
+ internal static bool IsEnvironmentVariableSearch(string search)
+ {
+ return search.StartsWith("%")
+ && search != "%%"
+ && !search.Contains('\\');
}
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchResult.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchResult.cs
new file mode 100644
index 000000000..92c24559d
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchResult.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace Flow.Launcher.Plugin.Explorer.Search
+{
+ public record struct SearchResult
+ {
+ public string FullPath { get; init; }
+ public ResultType Type { get; init; }
+ public int Score { get; init; }
+
+ public bool WindowsIndexed { get; init; }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs
deleted file mode 100644
index 2e842c843..000000000
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/IndexSearch.cs
+++ /dev/null
@@ -1,227 +0,0 @@
-using Flow.Launcher.Infrastructure.Logger;
-using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
-using Microsoft.Search.Interop;
-using System;
-using System.Collections.Generic;
-using System.Data.OleDb;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text.RegularExpressions;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows;
-
-namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
-{
- internal static class IndexSearch
- {
-
- // Reserved keywords in oleDB
- private const string reservedStringPattern = @"^[`\@\#\^,\&\/\\\$\%_;\[\]]+$";
-
- internal static async Task> ExecuteWindowsIndexSearchAsync(string indexQueryString, string connectionString, Query query, CancellationToken token)
- {
- var results = new List();
- var fileResults = new List();
-
- try
- {
- await using var conn = new OleDbConnection(connectionString);
- await conn.OpenAsync(token);
- token.ThrowIfCancellationRequested();
-
- await using var command = new OleDbCommand(indexQueryString, conn);
- // Results return as an OleDbDataReader.
- await using var dataReaderResults = await command.ExecuteReaderAsync(token) as OleDbDataReader;
- token.ThrowIfCancellationRequested();
-
- if (dataReaderResults.HasRows)
- {
- while (await dataReaderResults.ReadAsync(token))
- {
- token.ThrowIfCancellationRequested();
- if (dataReaderResults.GetValue(0) != DBNull.Value && dataReaderResults.GetValue(1) != DBNull.Value)
- {
- // # is URI syntax for the fragment component, need to be encoded so LocalPath returns complete path
- var encodedFragmentPath = dataReaderResults
- .GetString(1)
- .Replace("#", "%23", StringComparison.OrdinalIgnoreCase);
-
- var path = new Uri(encodedFragmentPath).LocalPath;
-
- if (dataReaderResults.GetString(2) == "Directory")
- {
- results.Add(ResultManager.CreateFolderResult(
- dataReaderResults.GetString(0),
- path,
- path,
- query, 0, true, true));
- }
- else
- {
- fileResults.Add(ResultManager.CreateFileResult(path, query, 0, true, true));
- }
- }
- }
- }
- }
- catch (OperationCanceledException)
- {
- // return empty result when cancelled
- return results;
- }
- catch (InvalidOperationException e)
- {
- // Internal error from ExecuteReader(): Connection closed.
- LogException("Internal error from ExecuteReader()", e);
- }
- catch (Exception e)
- {
- LogException("General error from performing index search", e);
- }
-
- results.AddRange(fileResults);
-
- // Intial ordering, this order can be updated later by UpdateResultView.MainViewModel based on history of user selection.
- return results;
- }
-
- internal async static Task> WindowsIndexSearchAsync(
- string searchString,
- Func createQueryHelper,
- Func constructQuery,
- List exclusionList,
- Query query,
- CancellationToken token)
- {
- var regexMatch = Regex.Match(searchString, reservedStringPattern);
-
- if (regexMatch.Success)
- return new List();
-
- try
- {
- var constructedQuery = constructQuery(searchString);
-
- return RemoveResultsInExclusionList(
- await ExecuteWindowsIndexSearchAsync(constructedQuery, createQueryHelper().ConnectionString, query, token).ConfigureAwait(false),
- exclusionList,
- token);
- }
- catch (COMException)
- {
- // Occurs because the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
- if (!SearchManager.Settings.WarnWindowsSearchServiceOff)
- return new List();
-
- return ResultForWindexSearchOff(query.RawQuery);
- }
- }
-
- private static List RemoveResultsInExclusionList(List results, List exclusionList, CancellationToken token)
- {
- var indexExclusionListCount = exclusionList.Count;
-
- if (indexExclusionListCount == 0)
- return results;
-
- var filteredResults = new List();
-
- for (var index = 0; index < results.Count; index++)
- {
- token.ThrowIfCancellationRequested();
-
- var excludeResult = false;
-
- for (var i = 0; i < indexExclusionListCount; i++)
- {
- token.ThrowIfCancellationRequested();
-
- if (results[index].SubTitle.StartsWith(exclusionList[i].Path, StringComparison.OrdinalIgnoreCase))
- {
- excludeResult = true;
- break;
- }
- }
-
- if (!excludeResult)
- filteredResults.Add(results[index]);
- }
-
- return filteredResults;
- }
-
- internal static bool PathIsIndexed(string path)
- {
- try
- {
- var csm = new CSearchManager();
- var indexManager = csm.GetCatalog("SystemIndex").GetCrawlScopeManager();
- return indexManager.IncludedInCrawlScope(path) > 0;
- }
- catch(COMException)
- {
- // Occurs because the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
- return false;
- }
- }
-
- private static List ResultForWindexSearchOff(string rawQuery)
- {
- var api = SearchManager.Context.API;
-
- return new List
- {
- new Result
- {
- Title = api.GetTranslation("plugin_explorer_windowsSearchServiceNotRunning"),
- SubTitle = api.GetTranslation("plugin_explorer_windowsSearchServiceFix"),
- Action = c =>
- {
- SearchManager.Settings.WarnWindowsSearchServiceOff = false;
-
- var pluginsManagerPlugin= api.GetAllPlugins().FirstOrDefault(x => x.Metadata.ID == "9f8f9b14-2518-4907-b211-35ab6290dee7");
-
- var actionKeywordCount = pluginsManagerPlugin.Metadata.ActionKeywords.Count;
-
- if (actionKeywordCount > 1)
- LogException("PluginsManager's action keyword has increased to more than 1, this does not allow for determining the " +
- "right action keyword. Explorer's code for managing Windows Search service not running exception needs to be updated",
- new InvalidOperationException());
-
- if (MessageBox.Show(string.Format(api.GetTranslation("plugin_explorer_alternative"), Environment.NewLine),
- api.GetTranslation("plugin_explorer_alternative_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes
- && actionKeywordCount == 1)
- {
- api.ChangeQuery(string.Format("{0} install everything", pluginsManagerPlugin.Metadata.ActionKeywords[0]));
- }
- else
- {
- // Clears the warning message because same query string will not alter the displayed result list
- api.ChangeQuery(string.Empty);
-
- api.ChangeQuery(rawQuery);
- }
-
- var mainWindow = Application.Current.MainWindow;
- mainWindow.Show();
- mainWindow.Focus();
-
- return false;
- },
- IcoPath = Constants.ExplorerIconImagePath
- }
- };
- }
-
- private static void LogException(string message, Exception e)
- {
-#if DEBUG // Please investigate and handle error from index search
- throw e;
-#else
- Log.Exception($"|Flow.Launcher.Plugin.Explorer.IndexSearch|{message}", e);
-#endif
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs
index 20e85bbb5..87eca91da 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs
@@ -1,10 +1,12 @@
+using System;
+using System.Buffers;
using Microsoft.Search.Interop;
namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
{
public class QueryConstructor
{
- private readonly Settings settings;
+ private Settings settings { get; }
private const string SystemIndex = "SystemIndex";
@@ -35,6 +37,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
internal CSearchQueryHelper CreateQueryHelper()
{
// This uses the Microsoft.Search.Interop assembly
+ // Throws COMException if Windows Search service is not running/disabled, this needs to be caught
var manager = new CSearchManager();
// SystemIndex catalog is the default catalog in Windows
@@ -42,98 +45,67 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
// Get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer
var queryHelper = catalogManager.GetQueryHelper();
-
+
return queryHelper;
}
- ///
- /// Set the required WHERE clause restriction to search on the first level of a specified directory.
- ///
- public string QueryWhereRestrictionsForTopLevelDirectorySearch(string path)
- {
- var searchDepth = $"directory='file:";
-
- return QueryWhereRestrictionsFromLocationPath(path, searchDepth);
- }
-
- ///
- /// Set the required WHERE clause restriction to search all files and subfolders of a specified directory.
- ///
- public string QueryWhereRestrictionsForTopLevelDirectoryAllFilesAndFoldersSearch(string path)
- {
- var searchDepth = $"scope='file:";
-
- return QueryWhereRestrictionsFromLocationPath(path, searchDepth);
- }
-
- private string QueryWhereRestrictionsFromLocationPath(string path, string searchDepth)
- {
- if (path.EndsWith(Constants.DirectorySeperator))
- return searchDepth + $"{path}'";
-
- var indexOfSeparator = path.LastIndexOf(Constants.DirectorySeperator);
-
- var itemName = path.Substring(indexOfSeparator + 1);
-
- if (itemName.StartsWith(Constants.AllFilesFolderSearchWildcard))
- itemName = itemName.Substring(1);
-
- var previousLevelDirectory = path.Substring(0, indexOfSeparator);
-
- if (string.IsNullOrEmpty(itemName))
- return $"{searchDepth}{previousLevelDirectory}'";
-
- return $"(System.FileName LIKE '{itemName}%' OR CONTAINS(System.FileName,'\"{itemName}*\"',1033)) AND {searchDepth}{previousLevelDirectory}'";
- }
+ public static string TopLevelDirectoryConstraint(ReadOnlySpan path) => $"directory='file:{path}'";
+ public static string RecursiveDirectoryConstraint(ReadOnlySpan path) => $"scope='file:{path}'";
+
///
/// Search will be performed on all folders and files on the first level of a specified directory.
///
- public string QueryForTopLevelDirectorySearch(string path)
+ public string Directory(ReadOnlySpan path, ReadOnlySpan searchString = default, bool recursive = false)
{
- string query = "SELECT TOP " + settings.MaxResult + $" {CreateBaseQuery().QuerySelectColumns} FROM {SystemIndex} WHERE ";
+ var queryConstraint = searchString.IsWhiteSpace() ? "" : $"AND ({FileName} LIKE '{searchString}%' OR CONTAINS({FileName},'\"{searchString}*\"'))";
- if (path.LastIndexOf(Constants.AllFilesFolderSearchWildcard) > path.LastIndexOf(Constants.DirectorySeperator))
- return query + QueryWhereRestrictionsForTopLevelDirectoryAllFilesAndFoldersSearch(path) + QueryOrderByFileNameRestriction;
+ var scopeConstraint = recursive
+ ? RecursiveDirectoryConstraint(path)
+ : TopLevelDirectoryConstraint(path);
- return query + QueryWhereRestrictionsForTopLevelDirectorySearch(path) + QueryOrderByFileNameRestriction;
+ var query = $"SELECT TOP {settings.MaxResult} {CreateBaseQuery().QuerySelectColumns} FROM {SystemIndex} WHERE {scopeConstraint} {queryConstraint} ORDER BY {FileName}";
+
+ return query;
}
///
/// Search will be performed on all folders and files based on user's search keywords.
///
- public string QueryForAllFilesAndFolders(string userSearchString)
+ public string FilesAndFolders(ReadOnlySpan userSearchString)
{
+ if (userSearchString.IsWhiteSpace())
+ userSearchString = "*";
+
// Generate SQL from constructed parameters, converting the userSearchString from AQS->WHERE clause
- return CreateBaseQuery().GenerateSQLFromUserQuery(userSearchString) + " AND " + QueryWhereRestrictionsForAllFilesAndFoldersSearch
- + QueryOrderByFileNameRestriction;
+ return $"{CreateBaseQuery().GenerateSQLFromUserQuery(userSearchString.ToString())} AND {RestrictionsForAllFilesAndFoldersSearch} ORDER BY {FileName}";
}
///
/// Set the required WHERE clause restriction to search for all files and folders.
///
- public const string QueryWhereRestrictionsForAllFilesAndFoldersSearch = "scope='file:'";
+ public const string RestrictionsForAllFilesAndFoldersSearch = "scope='file:'";
- public const string QueryOrderByFileNameRestriction = " ORDER BY System.FileName";
+ ///
+ /// Order identifier: file name
+ ///
+ public const string FileName = "System.FileName";
///
/// Search will be performed on all indexed file contents for the specified search keywords.
///
- public string QueryForFileContentSearch(string userSearchString)
+ public string FileContent(ReadOnlySpan userSearchString)
{
- string query = "SELECT TOP " + settings.MaxResult + $" {CreateBaseQuery().QuerySelectColumns} FROM {SystemIndex} WHERE ";
+ string query =
+ $"SELECT TOP {settings.MaxResult} {CreateBaseQuery().QuerySelectColumns} FROM {SystemIndex} WHERE {RestrictionsForFileContentSearch(userSearchString)} AND {RestrictionsForAllFilesAndFoldersSearch} ORDER BY {FileName}";
- return query + QueryWhereRestrictionsForFileContentSearch(userSearchString) + " AND " + QueryWhereRestrictionsForAllFilesAndFoldersSearch
- + QueryOrderByFileNameRestriction;
+ return query;
}
///
/// Set the required WHERE clause restriction to search within file content.
///
- public string QueryWhereRestrictionsForFileContentSearch(string searchQuery)
- {
- return $"FREETEXT('{searchQuery}')";
- }
+ public static string RestrictionsForFileContentSearch(ReadOnlySpan searchQuery) => $"FREETEXT('{searchQuery}')";
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs
new file mode 100644
index 000000000..2093508a0
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs
@@ -0,0 +1,106 @@
+using Flow.Launcher.Infrastructure.Logger;
+using Microsoft.Search.Interop;
+using System;
+using System.Collections.Generic;
+using System.Data.OleDb;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
+{
+ internal static class WindowsIndex
+ {
+
+ // Reserved keywords in oleDB
+ private static Regex _reservedPatternMatcher = new(@"^[`\@\@\#\#\*\^,\&\&\/\\\$\%_;\[\]]+$", RegexOptions.Compiled);
+
+ private static async IAsyncEnumerable ExecuteWindowsIndexSearchAsync(string indexQueryString, string connectionString, [EnumeratorCancellation] CancellationToken token)
+ {
+ await using var conn = new OleDbConnection(connectionString);
+ await conn.OpenAsync(token);
+ token.ThrowIfCancellationRequested();
+
+ await using var command = new OleDbCommand(indexQueryString, conn);
+ // Results return as an OleDbDataReader.
+ OleDbDataReader dataReaderAttempt;
+ try
+ {
+ dataReaderAttempt = await command.ExecuteReaderAsync(token) as OleDbDataReader;
+ }
+ catch (OleDbException e)
+ {
+ Log.Exception($"|WindowsIndex.ExecuteWindowsIndexSearchAsync|Failed to execute windows index search query: {indexQueryString}", e);
+ yield break;
+ }
+ await using var dataReader = dataReaderAttempt;
+ token.ThrowIfCancellationRequested();
+
+ if (dataReader is not { HasRows: true })
+ {
+ yield break;
+ }
+
+ while (await dataReader.ReadAsync(token))
+ {
+ token.ThrowIfCancellationRequested();
+ if (dataReader.GetValue(0) == DBNull.Value || dataReader.GetValue(1) == DBNull.Value)
+ {
+ continue;
+ }
+ // # is URI syntax for the fragment component, need to be encoded so LocalPath returns complete path
+ var encodedFragmentPath = dataReader
+ .GetString(1)
+ .Replace("#", "%23", StringComparison.OrdinalIgnoreCase);
+
+ var path = new Uri(encodedFragmentPath).LocalPath;
+
+ yield return new SearchResult
+ {
+ FullPath = path,
+ Type = dataReader.GetString(2) == "Directory" ? ResultType.Folder : ResultType.File,
+ WindowsIndexed = true
+ };
+ }
+
+ // Initial ordering, this order can be updated later by UpdateResultView.MainViewModel based on history of user selection.
+ }
+
+ internal static IAsyncEnumerable WindowsIndexSearchAsync(
+ string connectionString,
+ string search,
+ CancellationToken token)
+ {
+ try
+ {
+
+ return _reservedPatternMatcher.IsMatch(search)
+ ? AsyncEnumerable.Empty()
+ : ExecuteWindowsIndexSearchAsync(search, connectionString, token);
+ }
+ catch (InvalidOperationException e)
+ {
+ throw new SearchException("Windows Index", e.Message, e);
+ }
+ }
+
+ internal static bool PathIsIndexed(string path)
+ {
+ try
+ {
+ var csm = new CSearchManager();
+ var indexManager = csm.GetCatalog("SystemIndex").GetCrawlScopeManager();
+ return indexManager.IncludedInCrawlScope(path) > 0;
+ }
+ catch (COMException)
+ {
+ // Occurs because the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
+ return false;
+ }
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndexSearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndexSearchManager.cs
new file mode 100644
index 000000000..c3a7d9e91
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndexSearchManager.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin.Explorer.Exceptions;
+using Flow.Launcher.Plugin.Explorer.Search.IProvider;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
+{
+ public class WindowsIndexSearchManager : IIndexProvider, IContentIndexProvider, IPathIndexProvider
+ {
+ private Settings Settings { get; }
+
+ private QueryConstructor QueryConstructor { get; }
+
+ public WindowsIndexSearchManager(Settings settings)
+ {
+ Settings = settings;
+ QueryConstructor = new QueryConstructor(Settings);
+ }
+
+ private IAsyncEnumerable WindowsIndexFileContentSearchAsync(
+ ReadOnlySpan querySearchString,
+ CancellationToken token)
+ {
+ if (querySearchString.IsEmpty)
+ return AsyncEnumerable.Empty();
+
+ try
+ {
+ return WindowsIndex.WindowsIndexSearchAsync(
+ QueryConstructor.CreateQueryHelper().ConnectionString,
+ QueryConstructor.FileContent(querySearchString),
+ token);
+ }
+ catch (COMException)
+ {
+ // Occurs when the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
+ // Thrown by QueryConstructor.CreateQueryHelper()
+ return HandledEngineNotAvailableExceptionAsync();
+ }
+ }
+
+ private IAsyncEnumerable WindowsIndexFilesAndFoldersSearchAsync(
+ ReadOnlySpan querySearchString,
+ CancellationToken token = default)
+ {
+ try
+ {
+ return WindowsIndex.WindowsIndexSearchAsync(
+ QueryConstructor.CreateQueryHelper().ConnectionString,
+ QueryConstructor.FilesAndFolders(querySearchString),
+ token);
+ }
+ catch (COMException)
+ {
+ // Occurs when the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
+ // Thrown by QueryConstructor.CreateQueryHelper()
+ return HandledEngineNotAvailableExceptionAsync();
+ }
+ }
+
+ private IAsyncEnumerable WindowsIndexTopLevelFolderSearchAsync(
+ ReadOnlySpan search,
+ ReadOnlySpan path,
+ bool recursive,
+ CancellationToken token)
+ {
+ try
+ {
+ return WindowsIndex.WindowsIndexSearchAsync(
+ QueryConstructor.CreateQueryHelper().ConnectionString,
+ QueryConstructor.Directory(path, search, recursive),
+ token);
+ }
+ catch (COMException)
+ {
+ // Occurs when the Windows Indexing (WSearch) is turned off in services and unable to be used by Explorer plugin
+ // Thrown by QueryConstructor.CreateQueryHelper()
+ return HandledEngineNotAvailableExceptionAsync();
+ }
+ }
+ public IAsyncEnumerable SearchAsync(string search, CancellationToken token)
+ {
+ return WindowsIndexFilesAndFoldersSearchAsync(search, token: token);
+ }
+ public IAsyncEnumerable ContentSearchAsync(string plainSearch, string contentSearch, CancellationToken token)
+ {
+ return WindowsIndexFileContentSearchAsync(contentSearch, token);
+ }
+ public IAsyncEnumerable EnumerateAsync(string path, string search, bool recursive, CancellationToken token)
+ {
+ return WindowsIndexTopLevelFolderSearchAsync(search, path, recursive, token);
+ }
+
+ private IAsyncEnumerable HandledEngineNotAvailableExceptionAsync()
+ {
+ if (!Settings.WarnWindowsSearchServiceOff)
+ return AsyncEnumerable.Empty();
+
+ var api = Main.Context.API;
+
+ throw new EngineNotAvailableException(
+ "Windows Index",
+ api.GetTranslation("plugin_explorer_windowsSearchServiceFix"),
+ api.GetTranslation("plugin_explorer_windowsSearchServiceNotRunning"),
+ Constants.WindowsIndexErrorImagePath,
+ c =>
+ {
+ Settings.WarnWindowsSearchServiceOff = false;
+
+ // Clears the warning message so user is not mistaken that it has not worked
+ api.ChangeQuery(string.Empty);
+
+ return ValueTask.FromResult(false);
+ });
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
index 351091dfe..4077e2fcc 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -1,7 +1,15 @@
+using Flow.Launcher.Plugin.Everything.Everything;
using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex;
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Text.Json.Serialization;
+using Flow.Launcher.Plugin.Explorer.Search.IProvider;
namespace Flow.Launcher.Plugin.Explorer
{
@@ -9,14 +17,22 @@ namespace Flow.Launcher.Plugin.Explorer
{
public int MaxResult { get; set; } = 100;
- public List QuickAccessLinks { get; set; } = new List();
+ public ObservableCollection QuickAccessLinks { get; set; } = new();
- // as at v1.7.0 this is to maintain backwards compatibility, need to be removed afterwards.
- public List QuickFolderAccessLinks { get; set; } = new List();
+ public ObservableCollection IndexSearchExcludedSubdirectoryPaths { get; set; } = new ObservableCollection();
- public bool UseWindowsIndexForDirectorySearch { get; set; } = true;
+ public string EditorPath { get; set; } = "";
- public List IndexSearchExcludedSubdirectoryPaths { get; set; } = new List();
+ public string FolderEditorPath { get; set; } = "";
+
+ public string ShellPath { get; set; } = "cmd";
+
+
+ public bool UseLocationAsWorkingDir { get; set; } = false;
+
+ public bool ShowWindowsContextMenu { get; set; } = true;
+
+ public bool DefaultOpenFolderInFileManager { get; set; } = false;
public string SearchActionKeyword { get; set; } = Query.GlobalPluginWildcardSign;
@@ -38,8 +54,94 @@ namespace Flow.Launcher.Plugin.Explorer
public bool QuickAccessKeywordEnabled { get; set; }
+
public bool WarnWindowsSearchServiceOff { get; set; } = true;
+ private EverythingSearchManager _everythingManagerInstance;
+ private WindowsIndexSearchManager _windowsIndexSearchManager;
+
+ #region SearchEngine
+
+ private EverythingSearchManager EverythingManagerInstance => _everythingManagerInstance ??= new EverythingSearchManager(this);
+ private WindowsIndexSearchManager WindowsIndexSearchManager => _windowsIndexSearchManager ??= new WindowsIndexSearchManager(this);
+
+
+ public IndexSearchEngineOption IndexSearchEngine { get; set; } = IndexSearchEngineOption.WindowsIndex;
+ [JsonIgnore]
+ public IIndexProvider IndexProvider => IndexSearchEngine switch
+ {
+ IndexSearchEngineOption.Everything => EverythingManagerInstance,
+ IndexSearchEngineOption.WindowsIndex => WindowsIndexSearchManager,
+ _ => throw new ArgumentOutOfRangeException(nameof(IndexSearchEngine))
+ };
+
+ public PathEnumerationEngineOption PathEnumerationEngine { get; set; } = PathEnumerationEngineOption.WindowsIndex;
+
+ [JsonIgnore]
+ public IPathIndexProvider PathEnumerator => PathEnumerationEngine switch
+ {
+ PathEnumerationEngineOption.Everything => EverythingManagerInstance,
+ PathEnumerationEngineOption.WindowsIndex => WindowsIndexSearchManager,
+ _ => throw new ArgumentOutOfRangeException(nameof(PathEnumerationEngine))
+ };
+
+ public ContentIndexSearchEngineOption ContentSearchEngine { get; set; } = ContentIndexSearchEngineOption.WindowsIndex;
+ [JsonIgnore]
+ public IContentIndexProvider ContentIndexProvider => ContentSearchEngine switch
+ {
+ ContentIndexSearchEngineOption.Everything => EverythingManagerInstance,
+ ContentIndexSearchEngineOption.WindowsIndex => WindowsIndexSearchManager,
+ _ => throw new ArgumentOutOfRangeException(nameof(ContentSearchEngine))
+ };
+
+ public enum PathEnumerationEngineOption
+ {
+ [Description("plugin_explorer_engine_windows_index")]
+ WindowsIndex,
+ [Description("plugin_explorer_engine_everything")]
+ Everything,
+ [Description("plugin_explorer_path_enumeration_engine_none")]
+ DirectEnumeration
+ }
+
+ public enum IndexSearchEngineOption
+ {
+ [Description("plugin_explorer_engine_windows_index")]
+ WindowsIndex,
+ [Description("plugin_explorer_engine_everything")]
+ Everything,
+ }
+
+ public enum ContentIndexSearchEngineOption
+ {
+ [Description("plugin_explorer_engine_windows_index")]
+ WindowsIndex,
+ [Description("plugin_explorer_engine_everything")]
+ Everything,
+ }
+
+ #endregion
+
+
+ #region Everything Settings
+
+ public string EverythingInstalledPath { get; set; }
+
+ [JsonIgnore]
+ public SortOption[] SortOptions { get; set; } = Enum.GetValues();
+
+ public SortOption SortOption { get; set; } = SortOption.NAME_ASCENDING;
+
+ public bool EnableEverythingContentSearch { get; set; } = false;
+
+ public bool EverythingEnabled => IndexSearchEngine == IndexSearchEngineOption.Everything ||
+ PathEnumerationEngine == PathEnumerationEngineOption.Everything ||
+ ContentSearchEngine == ContentIndexSearchEngineOption.Everything;
+
+ public bool EverythingSearchFullPath { get; set; } = false;
+
+ #endregion
+
internal enum ActionKeyword
{
SearchActionKeyword,
@@ -89,4 +191,4 @@ namespace Flow.Launcher.Plugin.Explorer
_ => throw new ArgumentOutOfRangeException(nameof(actionKeyword), actionKeyword, "ActionKeyword enabled status not defined")
};
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
new file mode 100644
index 000000000..2f614ead8
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
@@ -0,0 +1,57 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+
+namespace Flow.Launcher.Plugin.Explorer.Views
+{
+ public class ActionKeywordModel : INotifyPropertyChanged
+ {
+ private static Settings _settings;
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public static void Init(Settings settings)
+ {
+ _settings = settings;
+ }
+
+ internal ActionKeywordModel(Settings.ActionKeyword actionKeyword, string description)
+ {
+ KeywordProperty = actionKeyword;
+ Description = description;
+ }
+
+ public string Description { get; private init; }
+
+ internal Settings.ActionKeyword KeywordProperty { get; }
+
+ private void OnPropertyChanged([CallerMemberName] string propertyName = "")
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ private string? keyword;
+
+ public string Keyword
+ {
+ get => keyword ??= _settings.GetActionKeyword(KeywordProperty);
+ set
+ {
+ keyword = value;
+ _settings.SetActionKeyword(KeywordProperty, value);
+ OnPropertyChanged();
+ }
+ }
+ private bool? enabled;
+
+ public bool Enabled
+ {
+ get => enabled ??= _settings.GetActionKeywordEnabled(KeywordProperty);
+ set
+ {
+ enabled = value;
+ _settings.SetActionKeywordEnabled(KeywordProperty, value);
+ OnPropertyChanged();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/EnumBindingModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/EnumBindingModel.cs
new file mode 100644
index 000000000..29c81a465
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/EnumBindingModel.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+namespace Flow.Launcher.Plugin.Explorer.ViewModels;
+
+public class EnumBindingModel where T : struct, Enum
+{
+ public static IReadOnlyList> CreateList()
+ {
+ return Enum.GetValues()
+ .Select(value => new EnumBindingModel
+ {
+ Value = value, LocalizationKey = GetDescriptionAttr(value)
+ })
+ .ToArray();
+ }
+
+ public EnumBindingModel From(T value)
+ {
+ var name = value.ToString();
+ var description = GetDescriptionAttr(value);
+
+ return new EnumBindingModel
+ {
+ Name = name,
+ LocalizationKey = description,
+ Value = value
+ };
+ }
+
+ private static string GetDescriptionAttr(T source)
+ {
+ var fi = source.GetType().GetField(source.ToString());
+
+ var attributes = (DescriptionAttribute[])fi?.GetCustomAttributes(
+ typeof(DescriptionAttribute), false);
+
+ return attributes is { Length: > 0 } ? attributes[0].Description : source.ToString();
+
+ }
+
+ public string Name { get; set; }
+ private string LocalizationKey { get; set; }
+ public string Description => Main.Context.API.GetTranslation(LocalizationKey);
+ public T Value { get; set; }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs
new file mode 100644
index 000000000..ff704b679
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Windows.Input;
+
+namespace Flow.Launcher.Plugin.Explorer.ViewModels
+{
+ internal class RelayCommand : ICommand
+ {
+ private Action _action;
+
+ public RelayCommand(Action action)
+ {
+ _action = action;
+ }
+
+ public virtual bool CanExecute(object parameter)
+ {
+ return true;
+ }
+
+ public event EventHandler CanExecuteChanged;
+
+ public virtual void Execute(object parameter)
+ {
+ _action?.Invoke(parameter);
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 77ec5457b..189434eea 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -1,22 +1,40 @@
-using Flow.Launcher.Core.Plugin;
-using Flow.Launcher.Infrastructure.Storage;
+#nullable enable
using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
+using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+using Flow.Launcher.Plugin.Explorer.Views;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Diagnostics;
-using System.Threading.Tasks;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using System.Windows.Forms;
+using System.Windows.Input;
+using MessageBox = System.Windows.Forms.MessageBox;
namespace Flow.Launcher.Plugin.Explorer.ViewModels
{
- public class SettingsViewModel
+ public class SettingsViewModel : BaseModel
{
- internal Settings Settings { get; set; }
+ public Settings Settings { get; set; }
internal PluginInitContext Context { get; set; }
+ public IReadOnlyList> IndexSearchEngines { get; set; }
+ public IReadOnlyList> ContentIndexSearchEngines { get; set; }
+ public IReadOnlyList> PathEnumerationEngines { get; set; }
+
public SettingsViewModel(PluginInitContext context, Settings settings)
{
Context = context;
Settings = settings;
+
+ InitializeEngineSelection();
+ InitializeActionKeywordModels();
}
@@ -25,11 +43,267 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
Context.API.SaveSettingJsonStorage();
}
- internal void RemoveLinkFromQuickAccess(AccessLink selectedRow) => Settings.QuickAccessLinks.Remove(selectedRow);
+ #region Engine Selection
- internal void RemoveAccessLinkFromExcludedIndexPaths(AccessLink selectedRow) => Settings.IndexSearchExcludedSubdirectoryPaths.Remove(selectedRow);
+ private EnumBindingModel _selectedIndexSearchEngine;
+ private EnumBindingModel _selectedContentSearchEngine;
+ private EnumBindingModel _selectedPathEnumerationEngine;
- internal void OpenWindowsIndexingOptions()
+
+ public EnumBindingModel SelectedIndexSearchEngine
+ {
+ get => _selectedIndexSearchEngine;
+ set
+ {
+ _selectedIndexSearchEngine = value;
+ Settings.IndexSearchEngine = value.Value;
+ OnPropertyChanged();
+ }
+ }
+
+ public EnumBindingModel SelectedContentSearchEngine
+ {
+ get => _selectedContentSearchEngine;
+ set
+ {
+ _selectedContentSearchEngine = value;
+ Settings.ContentSearchEngine = value.Value;
+ OnPropertyChanged();
+ }
+ }
+
+ public EnumBindingModel SelectedPathEnumerationEngine
+ {
+ get => _selectedPathEnumerationEngine;
+ set
+ {
+ _selectedPathEnumerationEngine = value;
+ Settings.PathEnumerationEngine = value.Value;
+ OnPropertyChanged();
+ }
+ }
+
+ [MemberNotNull(nameof(IndexSearchEngines),
+ nameof(ContentIndexSearchEngines),
+ nameof(PathEnumerationEngines),
+ nameof(_selectedIndexSearchEngine),
+ nameof(_selectedContentSearchEngine),
+ nameof(_selectedPathEnumerationEngine))]
+ private void InitializeEngineSelection()
+ {
+ IndexSearchEngines = EnumBindingModel.CreateList();
+ ContentIndexSearchEngines = EnumBindingModel.CreateList();
+ PathEnumerationEngines = EnumBindingModel.CreateList();
+
+ _selectedIndexSearchEngine = IndexSearchEngines.First(x => x.Value == Settings.IndexSearchEngine);
+ _selectedContentSearchEngine = ContentIndexSearchEngines.First(x => x.Value == Settings.ContentSearchEngine);
+ _selectedPathEnumerationEngine = PathEnumerationEngines.First(x => x.Value == Settings.PathEnumerationEngine);
+ }
+
+ #endregion
+
+
+
+ #region ActionKeyword
+
+ [MemberNotNull(nameof(ActionKeywordsModels))]
+ private void InitializeActionKeywordModels()
+ {
+ ActionKeywordsModels = new List
+ {
+ new(Settings.ActionKeyword.SearchActionKeyword,
+ "plugin_explorer_actionkeywordview_search"),
+ new(Settings.ActionKeyword.FileContentSearchActionKeyword,
+ "plugin_explorer_actionkeywordview_filecontentsearch"),
+ new(Settings.ActionKeyword.PathSearchActionKeyword,
+ "plugin_explorer_actionkeywordview_pathsearch"),
+ new(Settings.ActionKeyword.IndexSearchActionKeyword,
+ "plugin_explorer_actionkeywordview_indexsearch"),
+ new(Settings.ActionKeyword.QuickAccessActionKeyword,
+ "plugin_explorer_actionkeywordview_quickaccess")
+ };
+ }
+
+ public IReadOnlyList ActionKeywordsModels { get; set; }
+
+ public ActionKeywordModel? SelectedActionKeyword { get; set; }
+
+ public ICommand EditActionKeywordCommand => new RelayCommand(EditActionKeyword);
+
+ private void EditActionKeyword(object obj)
+ {
+ if (SelectedActionKeyword is not { } actionKeyword)
+ {
+ ShowUnselectedMessage();
+ return;
+ }
+
+ var actionKeywordWindow = new ActionKeywordSetting(actionKeyword, Context.API);
+
+ if (!(actionKeywordWindow.ShowDialog() ?? false))
+ {
+ return;
+ }
+
+ switch (actionKeyword.Enabled, actionKeywordWindow.KeywordEnabled)
+ {
+ case (true, false):
+ Context.API.RemoveActionKeyword(Context.CurrentPluginMetadata.ID, actionKeyword.Keyword);
+ break;
+ case (true, true):
+ // same keyword will have dialog result false
+ Context.API.RemoveActionKeyword(Context.CurrentPluginMetadata.ID, actionKeyword.Keyword);
+ Context.API.AddActionKeyword(Context.CurrentPluginMetadata.ID, actionKeywordWindow.ActionKeyword);
+ break;
+ case (false, true):
+ Context.API.AddActionKeyword(Context.CurrentPluginMetadata.ID, actionKeywordWindow.ActionKeyword);
+ break;
+ case (false, false):
+ throw new ArgumentException(
+ $"Both false in {nameof(actionKeyword)}.{nameof(actionKeyword.Enabled)} and {nameof(actionKeywordWindow)}.{nameof(actionKeywordWindow.KeywordEnabled)} should suggest that the ShowDialog() result is false");
+ }
+
+ (actionKeyword.Keyword, actionKeyword.Enabled) = (actionKeywordWindow.ActionKeyword, actionKeywordWindow.KeywordEnabled);
+
+ }
+
+ #endregion
+
+ #region AccessLinks
+
+ public AccessLink? SelectedQuickAccessLink { get; set; }
+ public AccessLink? SelectedIndexSearchExcludedPath { get; set; }
+
+
+
+ public ICommand RemoveLinkCommand => new RelayCommand(RemoveLink);
+ public ICommand EditLinkCommand => new RelayCommand(EditLink);
+ public ICommand AddLinkCommand => new RelayCommand(AddLink);
+
+ public void AppendLink(string containerName, AccessLink link)
+ {
+ var container = containerName switch
+ {
+ "QuickAccessLink" => Settings.QuickAccessLinks,
+ "IndexSearchExcludedPaths" => Settings.IndexSearchExcludedSubdirectoryPaths,
+ _ => throw new ArgumentException($"Unknown container name: {containerName}")
+ };
+ container.Add(link);
+ }
+
+ private void EditLink(object commandParameter)
+ {
+ var (selectedLink, collection) = commandParameter switch
+ {
+ "QuickAccessLink" => (SelectedQuickAccessLink, Settings.QuickAccessLinks),
+ "IndexSearchExcludedPaths" => (SelectedIndexSearchExcludedPath, Settings.IndexSearchExcludedSubdirectoryPaths),
+ _ => throw new ArgumentOutOfRangeException(nameof(commandParameter))
+ };
+
+ if (selectedLink is null)
+ {
+ ShowUnselectedMessage();
+ return;
+ }
+
+ var path = PromptUserSelectPath(selectedLink.Type,
+ selectedLink.Type == ResultType.Folder
+ ? selectedLink.Path
+ : Path.GetDirectoryName(selectedLink.Path));
+
+ if (path is null)
+ return;
+
+ collection.Remove(selectedLink);
+ collection.Add(new AccessLink
+ {
+ Path = path, Type = selectedLink.Type,
+ });
+ }
+
+ private void ShowUnselectedMessage()
+ {
+ var warning = Context.API.GetTranslation("plugin_explorer_make_selection_warning");
+ MessageBox.Show(warning);
+ }
+
+
+ private void AddLink(object commandParameter)
+ {
+ var container = commandParameter switch
+ {
+ "QuickAccessLink" => Settings.QuickAccessLinks,
+ "IndexSearchExcludedPaths" => Settings.IndexSearchExcludedSubdirectoryPaths,
+ _ => throw new ArgumentOutOfRangeException(nameof(commandParameter))
+ };
+
+ ArgumentNullException.ThrowIfNull(container);
+
+ var folderBrowserDialog = new FolderBrowserDialog();
+
+ if (folderBrowserDialog.ShowDialog() != DialogResult.OK)
+ return;
+
+ var newAccessLink = new AccessLink
+ {
+ Path = folderBrowserDialog.SelectedPath
+ };
+
+ container.Add(newAccessLink);
+ }
+
+ private void RemoveLink(object obj)
+ {
+ if (obj is not string container) return;
+
+ switch (container)
+ {
+ case "QuickAccessLink":
+ if (SelectedQuickAccessLink == null) return;
+ Settings.QuickAccessLinks.Remove(SelectedQuickAccessLink);
+ break;
+ case "IndexSearchExcludedPaths":
+ if (SelectedIndexSearchExcludedPath == null) return;
+ Settings.IndexSearchExcludedSubdirectoryPaths.Remove(SelectedIndexSearchExcludedPath);
+ break;
+ }
+ Save();
+ }
+
+ #endregion
+
+ private string? PromptUserSelectPath(ResultType type, string? initialDirectory = null)
+ {
+ string? path = null;
+
+ if (type is ResultType.Folder)
+ {
+ var folderBrowserDialog = new FolderBrowserDialog();
+
+ if (initialDirectory is not null)
+ folderBrowserDialog.InitialDirectory = initialDirectory;
+
+ if (folderBrowserDialog.ShowDialog() != DialogResult.OK)
+ return path;
+
+ path = folderBrowserDialog.SelectedPath;
+ }
+ else if (type is ResultType.File)
+ {
+ var openFileDialog = new OpenFileDialog();
+ if (initialDirectory is not null)
+ openFileDialog.InitialDirectory = initialDirectory;
+
+ if (openFileDialog.ShowDialog() != DialogResult.OK)
+ return path;
+
+ path = openFileDialog.FileName;
+ }
+ return path;
+ }
+
+
+ internal static void OpenWindowsIndexingOptions()
{
var psi = new ProcessStartInfo
{
@@ -41,16 +315,127 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
Process.Start(psi);
}
- internal void UpdateActionKeyword(Settings.ActionKeyword modifiedActionKeyword, string newActionKeyword, string oldActionKeyword)
+ private ICommand? _openFileEditorPathCommand;
+
+ public ICommand OpenFileEditorPath => _openFileEditorPathCommand ??= new RelayCommand(_ =>
{
- PluginManager.ReplaceActionKeyword(Context.CurrentPluginMetadata.ID, oldActionKeyword, newActionKeyword);
+ var path = PromptUserSelectPath(ResultType.File, Settings.EditorPath != null ? Path.GetDirectoryName(Settings.EditorPath) : null);
+ if (path is null)
+ return;
+
+ FileEditorPath = path;
+ });
+
+ private ICommand? _openFolderEditorPathCommand;
+
+ public ICommand OpenFolderEditorPath => _openFolderEditorPathCommand ??= new RelayCommand(_ =>
+ {
+ var path = PromptUserSelectPath(ResultType.File, Settings.FolderEditorPath != null ? Path.GetDirectoryName(Settings.FolderEditorPath) : null);
+ if (path is null)
+ return;
+
+ FolderEditorPath = path;
+ });
+
+ private ICommand? _openShellPathCommand;
+
+ public ICommand OpenShellPath => _openShellPathCommand ??= new RelayCommand(_ =>
+ {
+ var path = PromptUserSelectPath(ResultType.File, Settings.EditorPath != null ? Path.GetDirectoryName(Settings.EditorPath) : null);
+ if (path is null)
+ return;
+
+ ShellPath = path;
+ });
+
+
+ public string FileEditorPath
+ {
+ get => Settings.EditorPath;
+ set
+ {
+ Settings.EditorPath = value;
+ OnPropertyChanged();
+ }
}
- internal bool IsActionKeywordAlreadyAssigned(string newActionKeyword)
+ public string FolderEditorPath
{
- return PluginManager.ActionKeywordRegistered(newActionKeyword);
+ get => Settings.FolderEditorPath;
+ set
+ {
+ Settings.FolderEditorPath = value;
+ OnPropertyChanged();
+ }
}
- internal bool IsNewActionKeywordGlobal(string newActionKeyword) => newActionKeyword == Query.GlobalPluginWildcardSign;
+ public string ShellPath
+ {
+ get => Settings.ShellPath;
+ set
+ {
+ Settings.ShellPath = value;
+ OnPropertyChanged();
+ }
+ }
+
+
+ #region Everything FastSortWarning
+
+ public Visibility FastSortWarningVisibility
+ {
+ get
+ {
+ try
+ {
+ return EverythingApi.IsFastSortOption(Settings.SortOption) ? Visibility.Collapsed : Visibility.Visible;
+ }
+ catch (IPCErrorException)
+ {
+ // this error occurs if the Everything service is not running, in this instance show the warning and
+ // update the message to let user know in the settings panel.
+ return Visibility.Visible;
+ }
+ catch (DllNotFoundException)
+ {
+ return Visibility.Collapsed;
+ }
+ }
+ }
+ public string SortOptionWarningMessage
+ {
+ get
+ {
+ try
+ {
+ // this method is used to determine if Everything service is running because as at Everything v1.4.1
+ // the sdk does not provide a dedicated interface to determine if it is running.
+ return EverythingApi.IsFastSortOption(Settings.SortOption) ? string.Empty
+ : Context.API.GetTranslation("flowlauncher_plugin_everything_nonfastsort_warning");
+ }
+ catch (IPCErrorException)
+ {
+ return Context.API.GetTranslation("flowlauncher_plugin_everything_is_not_running");
+ }
+ catch (DllNotFoundException)
+ {
+ return Context.API.GetTranslation("flowlauncher_plugin_everything_sdk_issue");
+ }
+ }
+ }
+
+ public string EverythingInstalledPath
+ {
+ get => Settings.EverythingInstalledPath;
+ set
+ {
+ Settings.EverythingInstalledPath = value;
+ OnPropertyChanged();
+ }
+ }
+
+ #endregion
+
+
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
index a46918483..d42505348 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
@@ -6,12 +6,13 @@
xmlns:local="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="{DynamicResource plugin_explorer_manageactionkeywords_header}"
- Width="400"
- SizeToContent="Height"
+ Width="Auto"
+ Height="255"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
+ SizeToContent="Width"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
@@ -60,7 +61,6 @@
-
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
index 27e4a0b9a..6ee4faad8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
@@ -2,7 +2,9 @@ using Flow.Launcher.Plugin.Explorer.ViewModels;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq;
+using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Input;
@@ -11,11 +13,9 @@ namespace Flow.Launcher.Plugin.Explorer.Views
///
/// Interaction logic for ActionKeywordSetting.xaml
///
- public partial class ActionKeywordSetting : Window
+ public partial class ActionKeywordSetting : INotifyPropertyChanged
{
- private SettingsViewModel settingsViewModel;
-
- public ActionKeywordView CurrentActionKeyword { get; set; }
+ private ActionKeywordModel CurrentActionKeyword { get; }
public string ActionKeyword
{
@@ -23,24 +23,27 @@ namespace Flow.Launcher.Plugin.Explorer.Views
set
{
// Set Enable to be true if user change ActionKeyword
- Enabled = true;
- actionKeyword = value;
+ KeywordEnabled = true;
+ _ = SetField(ref actionKeyword, value);
}
}
- public bool Enabled { get; set; }
+ public bool KeywordEnabled
+ {
+ get => _keywordEnabled;
+ set => SetField(ref _keywordEnabled, value);
+ }
private string actionKeyword;
+ private readonly IPublicAPI api;
+ private bool _keywordEnabled;
- public ActionKeywordSetting(SettingsViewModel settingsViewModel,
- ActionKeywordView selectedActionKeyword)
+ public ActionKeywordSetting(ActionKeywordModel selectedActionKeyword, IPublicAPI api)
{
- this.settingsViewModel = settingsViewModel;
-
CurrentActionKeyword = selectedActionKeyword;
-
+ this.api = api;
ActionKeyword = selectedActionKeyword.Keyword;
- Enabled = selectedActionKeyword.Enabled;
+ KeywordEnabled = selectedActionKeyword.Enabled;
InitializeComponent();
@@ -52,56 +55,38 @@ namespace Flow.Launcher.Plugin.Explorer.Views
if (string.IsNullOrEmpty(ActionKeyword))
ActionKeyword = Query.GlobalPluginWildcardSign;
- if (CurrentActionKeyword.Keyword == ActionKeyword && CurrentActionKeyword.Enabled == Enabled)
+ if (CurrentActionKeyword.Keyword == ActionKeyword && CurrentActionKeyword.Enabled == KeywordEnabled)
{
+ DialogResult = false;
Close();
return;
}
-
if (ActionKeyword == Query.GlobalPluginWildcardSign)
- switch (CurrentActionKeyword.KeywordProperty)
+ switch (CurrentActionKeyword.KeywordProperty, KeywordEnabled)
{
- case Settings.ActionKeyword.FileContentSearchActionKeyword:
- MessageBox.Show(settingsViewModel.Context.API.GetTranslation("plugin_explorer_globalActionKeywordInvalid"));
+ case (Settings.ActionKeyword.FileContentSearchActionKeyword, true):
+ MessageBox.Show(api.GetTranslation("plugin_explorer_globalActionKeywordInvalid"));
return;
- case Settings.ActionKeyword.QuickAccessActionKeyword:
- MessageBox.Show(settingsViewModel.Context.API.GetTranslation("plugin_explorer_quickaccess_globalActionKeywordInvalid"));
+ case (Settings.ActionKeyword.QuickAccessActionKeyword, true):
+ MessageBox.Show(api.GetTranslation("plugin_explorer_quickaccess_globalActionKeywordInvalid"));
return;
}
- var oldActionKeyword = CurrentActionKeyword.Keyword;
-
- if (!Enabled || !settingsViewModel.IsActionKeywordAlreadyAssigned(ActionKeyword))
+ if (!KeywordEnabled || !api.ActionKeywordAssigned(ActionKeyword))
{
- // Update View Data
- CurrentActionKeyword.Keyword = Enabled == true ? ActionKeyword : Query.GlobalPluginWildcardSign;
- CurrentActionKeyword.Enabled = Enabled;
-
- switch (Enabled)
- {
- // reset to global so it does not take up an action keyword when disabled
- // not for null Enable plugin
- case false when oldActionKeyword != Query.GlobalPluginWildcardSign:
- settingsViewModel.UpdateActionKeyword(CurrentActionKeyword.KeywordProperty,
- Query.GlobalPluginWildcardSign, oldActionKeyword);
- break;
- default:
- settingsViewModel.UpdateActionKeyword(CurrentActionKeyword.KeywordProperty,
- CurrentActionKeyword.Keyword, oldActionKeyword);
- break;
- }
-
+ DialogResult = true;
Close();
return;
}
// The keyword is not valid, so show message
- MessageBox.Show(settingsViewModel.Context.API.GetTranslation("newActionKeywordsHasBeenAssigned"));
+ MessageBox.Show(api.GetTranslation("newActionKeywordsHasBeenAssigned"));
}
private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
{
+ DialogResult = false;
Close();
}
private void TxtCurrentActionKeyword_OnKeyDown(object sender, KeyEventArgs e)
@@ -113,5 +98,18 @@ namespace Flow.Launcher.Plugin.Explorer.Views
e.Handled = true;
}
}
+ public event PropertyChangedEventHandler PropertyChanged;
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ private bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
+ {
+ if (EqualityComparer.Default.Equals(field, value))
+ return false;
+ field = value;
+ OnPropertyChanged(propertyName);
+ return true;
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs
new file mode 100644
index 000000000..e24b21dcd
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs
@@ -0,0 +1,20 @@
+using Flow.Launcher.Plugin.Everything.Everything;
+using Flow.Launcher.Plugin.Explorer.Helper;
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Plugin.Explorer.Views.Converters;
+
+public class EnumNameConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return value is SortOption option ? option.GetTranslatedName() : value;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index bbaacc18c..b0708b793 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -2,26 +2,118 @@
x:Class="Flow.Launcher.Plugin.Explorer.Views.ExplorerSettings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:converters="clr-namespace:Flow.Launcher.Plugin.Explorer.Views.Converters"
+ xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks"
+ xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Explorer.ViewModels"
xmlns:views="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
+ d:DataContext="{d:DesignInstance viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
-
+
+
-
-
-
-
+
+
+ Text="{Binding Description, Mode=OneTime, Converter={StaticResource TranslationConverter}}">
+
+
+
+
+
+
+
+
+
-
+
@@ -55,21 +121,116 @@
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ appref-ms
+
+
+ exe
+
+
+ lnk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -91,7 +259,7 @@
MinWidth="140"
Margin="5,0,0,0"
HorizontalAlignment="Right"
- Click="ButtonBase_OnClick"
+ Click="BtnAdd_OnClick"
Content="{DynamicResource flowlauncher_plugin_program_update}"
Style="{DynamicResource AccentButtonStyle}" />
diff --git a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
index 2a10928e6..31565c8b0 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml.cs
@@ -1,44 +1,76 @@
using System;
+using System.Collections.Generic;
using System.Windows;
namespace Flow.Launcher.Plugin.Program
{
- ///
- /// ProgramSuffixes.xaml 的交互逻辑
- ///
public partial class ProgramSuffixes
{
private PluginInitContext context;
private Settings _settings;
+ public Dictionary SuffixesStatus { get; set; }
+ public Dictionary ProtocolsStatus { get; set; }
+ public bool UseCustomSuffixes { get; set; }
+ public bool UseCustomProtocols { get; set; }
public ProgramSuffixes(PluginInitContext context, Settings settings)
{
this.context = context;
- InitializeComponent();
_settings = settings;
- tbSuffixes.Text = string.Join(Settings.SuffixSeperator.ToString(), _settings.ProgramSuffixes);
+ SuffixesStatus = new Dictionary(_settings.BuiltinSuffixesStatus);
+ ProtocolsStatus = new Dictionary(_settings.BuiltinProtocolsStatus);
+ UseCustomSuffixes = _settings.UseCustomSuffixes;
+ UseCustomProtocols = _settings.UseCustomProtocols;
+ InitializeComponent();
+ tbSuffixes.Text = string.Join(Settings.SuffixSeparator, _settings.CustomSuffixes);
+ tbProtocols.Text = string.Join(Settings.SuffixSeparator, _settings.CustomProtocols);
}
+
private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
{
Close();
}
- private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
- {
- var suffixes = tbSuffixes.Text.Split(Settings.SuffixSeperator, StringSplitOptions.RemoveEmptyEntries);
- if (suffixes.Length == 0)
+ private void BtnAdd_OnClick(object sender, RoutedEventArgs e)
+ {
+ var suffixes = tbSuffixes.Text.Split(Settings.SuffixSeparator, StringSplitOptions.RemoveEmptyEntries);
+ var protocols = tbProtocols.Text.Split(Settings.SuffixSeparator, StringSplitOptions.RemoveEmptyEntries);
+
+ if (suffixes.Length == 0 && UseCustomSuffixes)
{
string warning = context.API.GetTranslation("flowlauncher_plugin_program_suffixes_cannot_empty");
MessageBox.Show(warning);
return;
}
- _settings.ProgramSuffixes = suffixes;
+ if (protocols.Length == 0 && UseCustomProtocols)
+ {
+ string warning = context.API.GetTranslation("flowlauncher_plugin_protocols_cannot_empty");
+ MessageBox.Show(warning);
+ return;
+ }
- string msg = context.API.GetTranslation("flowlauncher_plugin_program_update_file_suffixes");
- MessageBox.Show(msg);
+ _settings.CustomSuffixes = suffixes;
+ _settings.CustomProtocols = protocols;
+ _settings.BuiltinSuffixesStatus = new Dictionary(SuffixesStatus);
+ _settings.BuiltinProtocolsStatus = new Dictionary(ProtocolsStatus);
+ _settings.UseCustomSuffixes = UseCustomSuffixes;
+ _settings.UseCustomProtocols = UseCustomProtocols;
DialogResult = true;
}
+
+ private void BtnReset_OnClick(object sender, RoutedEventArgs e)
+ {
+ apprefMS.IsChecked = true;
+ exe.IsChecked = true;
+ lnk.IsChecked = true;
+ CustomFiles.IsChecked = false;
+
+ steam.IsChecked = true;
+ epic.IsChecked = true;
+ http.IsChecked = false;
+ CustomProtocol.IsChecked = false;
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ApplicationActivationHelper.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ApplicationActivationHelper.cs
deleted file mode 100644
index 4b8423ed6..000000000
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/ApplicationActivationHelper.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Text.RegularExpressions;
-
-namespace Flow.Launcher.Plugin.Program.Programs
-{
- public class ApplicationActivationHelper
- {
- // Reference : https://github.com/MicrosoftEdge/edge-launcher/blob/108e63df0b4cb5cd9d5e45aa7a264690851ec51d/MIcrosoftEdgeLauncherCsharp/Program.cs
- public enum ActivateOptions
- {
- None = 0x00000000,
- DesignMode = 0x00000001,
- NoErrorUI = 0x00000002,
- NoSplashScreen = 0x00000004,
- }
-
- /// ApplicationActivationManager
- [ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- interface IApplicationActivationManager
- {
- IntPtr ActivateApplication([In] string appUserModelId, [In] string arguments, [In] ActivateOptions options, [Out] out uint processId);
- IntPtr ActivateForFile([In] string appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] string verb, [Out] out uint processId);
- IntPtr ActivateForProtocol([In] string appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out uint processId);
- }
-
- // Application Activation Manager Class
- [ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]
- public class ApplicationActivationManager : IApplicationActivationManager
- {
-
- [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/]
- public extern IntPtr ActivateApplication([In] string appUserModelId, [In] string arguments, [In] ActivateOptions options, [Out] out uint processId);
-
- [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
- public extern IntPtr ActivateForFile([In] string appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] string verb, [Out] out uint processId);
-
- [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
- public extern IntPtr ActivateForProtocol([In] string appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out uint processId);
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/AppxPackageHelper.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/AppxPackageHelper.cs
deleted file mode 100644
index e48f30757..000000000
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/AppxPackageHelper.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.ComTypes;
-using Windows.Storage;
-
-namespace Flow.Launcher.Plugin.Program.Programs
-{
- public class AppxPackageHelper
- {
- // This function returns a list of attributes of applications
- public List getAppsFromManifest(IStream stream)
- {
- List apps = new List();
- var appxFactory = new AppxFactory();
- var reader = ((IAppxFactory)appxFactory).CreateManifestReader(stream);
- var manifestApps = reader.GetApplications();
- while (manifestApps.GetHasCurrent())
- {
- string appListEntry;
- var manifestApp = manifestApps.GetCurrent();
- manifestApp.GetStringValue("AppListEntry", out appListEntry);
- if (appListEntry != "none")
- {
- apps.Add(manifestApp);
- }
- manifestApps.MoveNext();
- }
- return apps;
- }
-
- // Reference : https://stackoverflow.com/questions/32122679/getting-icon-of-modern-windows-app-from-a-desktop-application
- [Guid("5842a140-ff9f-4166-8f5c-62f5b7b0c781"), ComImport]
- public class AppxFactory
- {
- }
-
- [Guid("BEB94909-E451-438B-B5A7-D79E767B75D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IAppxFactory
- {
- void _VtblGap0_2(); // skip 2 methods
- IAppxManifestReader CreateManifestReader(IStream inputStream);
- }
-
- [Guid("4E1BD148-55A0-4480-A3D1-15544710637C"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IAppxManifestReader
- {
- void _VtblGap0_1(); // skip 1 method
- IAppxManifestProperties GetProperties();
- void _VtblGap1_5(); // skip 5 methods
- IAppxManifestApplicationsEnumerator GetApplications();
- }
-
- [Guid("9EB8A55A-F04B-4D0D-808D-686185D4847A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IAppxManifestApplicationsEnumerator
- {
- IAppxManifestApplication GetCurrent();
- bool GetHasCurrent();
- bool MoveNext();
- }
-
- [Guid("5DA89BF4-3773-46BE-B650-7E744863B7E8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IAppxManifestApplication
- {
- [PreserveSig]
- int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string name, [MarshalAs(UnmanagedType.LPWStr)] out string value);
-
- [PreserveSig]
- int GetAppUserModelId([MarshalAs(UnmanagedType.LPWStr)] out string value);
- }
-
- [Guid("03FAF64D-F26F-4B2C-AAF7-8FE7789B8BCA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IAppxManifestProperties
- {
- [PreserveSig]
- int GetBoolValue([MarshalAs(UnmanagedType.LPWStr)]string name, out bool value);
- [PreserveSig]
- int GetStringValue([MarshalAs(UnmanagedType.LPWStr)] string name, [MarshalAs(UnmanagedType.LPWStr)] out string value);
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
index d17048dcb..78c66d604 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
@@ -1,11 +1,9 @@
using System;
-using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
-using System.IO;
using Accessibility;
using System.Runtime.InteropServices.ComTypes;
-using System.Security.Policy;
+using Flow.Launcher.Plugin.Program.Logger;
namespace Flow.Launcher.Plugin.Program.Programs
{
@@ -100,8 +98,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
// To initialize the app description
- public String description = String.Empty;
-
+ public string description = string.Empty;
+ public string arguments = string.Empty;
// Retrieve the target path using Shell Link
public string retrieveTargetPath(string path)
@@ -122,16 +120,29 @@ namespace Flow.Launcher.Plugin.Program.Programs
// To set the app description
if (!String.IsNullOrEmpty(target))
{
- buffer = new StringBuilder(MAX_PATH);
- ((IShellLinkW)link).GetDescription(buffer, MAX_PATH);
- description = buffer.ToString();
+ try
+ {
+ buffer = new StringBuilder(MAX_PATH);
+ ((IShellLinkW)link).GetDescription(buffer, MAX_PATH);
+ description = buffer.ToString();
+ }
+ catch (COMException e)
+ {
+ // C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\MiracastView.lnk always cause exception
+ ProgramLogger.LogException($"|IShellLinkW|retrieveTargetPath|{path}" +
+ "|Error caused likely due to trying to get the description of the program",
+ e);
+ }
+
+ buffer.Clear();
+ ((IShellLinkW)link).GetArguments(buffer, MAX_PATH);
+ arguments = buffer.ToString();
}
// To release unmanaged memory
Marshal.ReleaseComObject(link);
return target;
-
}
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs
new file mode 100644
index 000000000..4f344d89e
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs
@@ -0,0 +1,92 @@
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+
+
+namespace Flow.Launcher.Plugin.Program.Programs
+{
+ // From PT Run
+ ///
+ /// 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
+ ///
+ public static class ShellLocalization
+ {
+ internal const uint DONTRESOLVEDLLREFERENCES = 0x00000001;
+ internal const uint LOADLIBRARYASDATAFILE = 0x00000002;
+
+ [DllImport("shell32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
+ internal static extern int SHGetLocalizedName(string pszPath, StringBuilder pszResModule, ref int cch, out int pidsRes);
+
+ [DllImport("user32.dll", EntryPoint = "LoadStringW", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
+ internal static extern int LoadString(IntPtr hModule, int resourceID, StringBuilder resourceValue, int len);
+
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, EntryPoint = "LoadLibraryExW")]
+ internal static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
+
+ [DllImport("kernel32.dll", ExactSpelling = true)]
+ internal static extern int FreeLibrary(IntPtr hModule);
+
+ [DllImport("kernel32.dll", EntryPoint = "ExpandEnvironmentStringsW", CharSet = CharSet.Unicode, ExactSpelling = true)]
+ internal static extern uint ExpandEnvironmentStrings(string lpSrc, StringBuilder lpDst, int nSize);
+
+ ///
+ /// Returns the localized name of a shell item.
+ ///
+ /// Path to the shell item (e. g. shortcut 'File Explorer.lnk').
+ /// The localized name as string or .
+ public static string GetLocalizedName(string path)
+ {
+ StringBuilder resourcePath = new StringBuilder(1024);
+ StringBuilder localizedName = new StringBuilder(1024);
+ int len, id;
+ len = resourcePath.Capacity;
+
+ // If there is no resource to localize a file name the method returns a non zero value.
+ if (SHGetLocalizedName(path, resourcePath, ref len, out id) == 0)
+ {
+ _ = ExpandEnvironmentStrings(resourcePath.ToString(), resourcePath, resourcePath.Capacity);
+ IntPtr hMod = LoadLibraryEx(resourcePath.ToString(), IntPtr.Zero, DONTRESOLVEDLLREFERENCES | LOADLIBRARYASDATAFILE);
+ if (hMod != IntPtr.Zero)
+ {
+ if (LoadString(hMod, id, localizedName, localizedName.Capacity) != 0)
+ {
+ string lString = localizedName.ToString();
+ _ = FreeLibrary(hMod);
+ return lString;
+ }
+
+ _ = FreeLibrary(hMod);
+ }
+ }
+
+ return string.Empty;
+ }
+
+ ///
+ /// This method returns the localized path to a shell item (folder or file)
+ ///
+ /// The path to localize
+ /// The localized path or the original path if localized version is not available
+ 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;
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
index 2a04b2b2e..8ba3ba800 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
@@ -1,23 +1,19 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.ComTypes;
using System.Security.Principal;
-using System.Text;
using System.Threading.Tasks;
-using System.Windows.Media;
using System.Windows.Media.Imaging;
-using System.Xml.Linq;
using Windows.ApplicationModel;
using Windows.Management.Deployment;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin.Program.Logger;
-using Rect = System.Windows.Rect;
using Flow.Launcher.Plugin.SharedModels;
-using Flow.Launcher.Infrastructure.Logger;
+using System.Threading.Channels;
+using System.Xml;
+using Windows.ApplicationModel.Core;
namespace Flow.Launcher.Plugin.Program.Programs
{
@@ -29,9 +25,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
public string FamilyName { get; }
public string Location { get; set; }
- public Application[] Apps { get; set; }
+ public Application[] Apps { get; set; } = Array.Empty();
- public PackageVersion Version { get; set; }
public UWP(Package package)
{
@@ -39,113 +34,175 @@ namespace Flow.Launcher.Plugin.Program.Programs
Name = package.Id.Name;
FullName = package.Id.FullName;
FamilyName = package.Id.FamilyName;
- InitializeAppInfo();
- Apps = Apps.Where(a =>
- {
- var valid =
- !string.IsNullOrEmpty(a.UserModelId) &&
- !string.IsNullOrEmpty(a.DisplayName);
- return valid;
- }).ToArray();
}
- private void InitializeAppInfo()
+ public void InitAppsInPackage(Package package)
{
- AppxPackageHelper _helper = new AppxPackageHelper();
- var path = Path.Combine(Location, "AppxManifest.xml");
-
- var namespaces = XmlNamespaces(path);
- InitPackageVersion(namespaces);
-
- const uint noAttribute = 0x80;
- const Stgm exclusiveRead = Stgm.Read | Stgm.ShareExclusive;
- var hResult = SHCreateStreamOnFileEx(path, exclusiveRead, noAttribute, false, null, out IStream stream);
-
- if (hResult == Hresult.Ok)
+ var apps = new List();
+ // WinRT
+ var appListEntries = package.GetAppListEntries();
+ foreach (var app in appListEntries)
{
- var apps = new List();
-
- List _apps = _helper.getAppsFromManifest(stream);
- foreach (var _app in _apps)
+ try
{
- var app = new Application(_app, this);
- apps.Add(app);
+ var tmp = new Application(app, this);
+ apps.Add(tmp);
}
-
- Apps = apps.Where(a => a.AppListEntry != "none").ToArray();
- }
- else
- {
- var e = Marshal.GetExceptionForHR((int)hResult);
- ProgramLogger.LogException($"|UWP|InitializeAppInfo|{path}" +
- "|Error caused while trying to get the details of the UWP program", e);
-
- Apps = new List().ToArray();
- }
-
- if (Marshal.ReleaseComObject(stream) > 0)
- {
- Log.Error("Flow.Launcher.Plugin.Program.Programs.UWP", "AppxManifest.xml was leaked");
- }
- }
-
-
-
- /// http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx
- private string[] XmlNamespaces(string path)
- {
- XDocument z = XDocument.Load(path);
- if (z.Root != null)
- {
- var namespaces = z.Root.Attributes().
- Where(a => a.IsNamespaceDeclaration).
- GroupBy(
- a => a.Name.Namespace == XNamespace.None ? string.Empty : a.Name.LocalName,
- a => XNamespace.Get(a.Value)
- ).Select(
- g => g.First().ToString()
- ).ToArray();
- return namespaces;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|XmlNamespaces|{path}" +
- $"|Error occured while trying to get the XML from {path}", new ArgumentNullException());
-
- return new string[] { };
- }
- }
-
- private void InitPackageVersion(string[] namespaces)
- {
- var versionFromNamespace = new Dictionary
- {
- {"http://schemas.microsoft.com/appx/manifest/foundation/windows10", PackageVersion.Windows10},
- {"http://schemas.microsoft.com/appx/2013/manifest", PackageVersion.Windows81},
- {"http://schemas.microsoft.com/appx/2010/manifest", PackageVersion.Windows8},
- };
-
- foreach (var n in versionFromNamespace.Keys)
- {
- if (namespaces.Contains(n))
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
+ "|Unexpected exception occurs when trying to construct a Application from package"
+ + $"{FullName} from location {Location}", e);
+ }
+ }
+ Apps = apps.ToArray();
+
+ try
+ {
+ var xmlDoc = GetManifestXml();
+ if (xmlDoc == null)
{
- Version = versionFromNamespace[n];
return;
}
+
+ var xmlRoot = xmlDoc.DocumentElement;
+ var packageVersion = GetPackageVersionFromManifest(xmlRoot);
+ if (!smallLogoNameFromVersion.TryGetValue(packageVersion, out string logoName) ||
+ !bigLogoNameFromVersion.TryGetValue(packageVersion, out string bigLogoName))
+ {
+ return;
+ }
+
+ var namespaceManager = new XmlNamespaceManager(xmlDoc.NameTable);
+ namespaceManager.AddNamespace("d", "http://schemas.microsoft.com/appx/manifest/foundation/windows10"); // still need a name
+ namespaceManager.AddNamespace("rescap", "http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities");
+ namespaceManager.AddNamespace("uap10", "http://schemas.microsoft.com/appx/manifest/uap/windows10/10");
+
+ var allowElevationNode = xmlRoot.SelectSingleNode("//rescap:Capability[@Name='allowElevation']", namespaceManager);
+ bool packageCanElevate = allowElevationNode != null;
+
+ var appsNode = xmlRoot.SelectSingleNode("d:Applications", namespaceManager);
+ foreach (var app in Apps)
+ {
+ // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
+ // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
+ var id = app.UserModelId.Split('!')[1];
+ var appNode = appsNode?.SelectSingleNode($"d:Application[@Id='{id}']", namespaceManager);
+ if (appNode != null)
+ {
+ app.CanRunElevated = packageCanElevate || Application.IfAppCanRunElevated(appNode);
+
+ // local name to fit all versions
+ var visualElement = appNode.SelectSingleNode($"*[local-name()='VisualElements']", namespaceManager);
+ var logoUri = visualElement?.Attributes[logoName]?.Value;
+ app.LogoPath = app.LogoPathFromUri(logoUri, (64, 64));
+ // use small logo or may have a big margin
+ var previewUri = visualElement?.Attributes[logoName]?.Value;
+ app.PreviewImagePath = app.LogoPathFromUri(previewUri, (256, 256));
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
+ "|Unexpected exception occurs when trying to construct a Application from package"
+ + $"{FullName} from location {Location}", e);
}
-
- ProgramLogger.LogException($"|UWP|XmlNamespaces|{Location}" +
- "|Trying to get the package version of the UWP program, but a unknown UWP appmanifest version "
- + $"{FullName} from location {Location} is returned.", new FormatException());
-
- Version = PackageVersion.Unknown;
}
- public static Application[] All()
+ private XmlDocument GetManifestXml()
{
- var windows10 = new Version(10, 0);
- var support = Environment.OSVersion.Version.Major >= windows10.Major;
- if (support)
+ var manifest = Path.Combine(Location, "AppxManifest.xml");
+ try
+ {
+ var file = File.ReadAllText(manifest);
+ var xmlDoc = new XmlDocument();
+ xmlDoc.LoadXml(file);
+ return xmlDoc;
+ }
+ catch (FileNotFoundException e)
+ {
+ ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}", "AppxManifest.xml not found.", e);
+ return null;
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}", "An unexpected error occurred and unable to parse AppxManifest.xml", e);
+ return null;
+ }
+ }
+
+ private PackageVersion GetPackageVersionFromManifest(XmlNode xmlRoot)
+ {
+ if (xmlRoot != null)
+ {
+
+ var namespaces = xmlRoot.Attributes;
+ foreach (XmlAttribute ns in namespaces)
+ {
+ if (versionFromNamespace.TryGetValue(ns.Value, out var packageVersion))
+ {
+ return packageVersion;
+ }
+ }
+
+ ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
+ "|Trying to get the package version of the UWP program, but an unknown UWP app-manifest version in package "
+ + $"{FullName} from location {Location}", new FormatException());
+ return PackageVersion.Unknown;
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
+ "|Can't parse AppManifest.xml of package "
+ + $"{FullName} from location {Location}", new ArgumentNullException(nameof(xmlRoot)));
+ return PackageVersion.Unknown;
+ }
+ }
+
+ private static readonly Dictionary versionFromNamespace = new()
+ {
+ {
+ "http://schemas.microsoft.com/appx/manifest/foundation/windows10", PackageVersion.Windows10
+ },
+ {
+ "http://schemas.microsoft.com/appx/2013/manifest", PackageVersion.Windows81
+ },
+ {
+ "http://schemas.microsoft.com/appx/2010/manifest", PackageVersion.Windows8
+ },
+ };
+
+ private static readonly Dictionary smallLogoNameFromVersion = new()
+ {
+ {
+ PackageVersion.Windows10, "Square44x44Logo"
+ },
+ {
+ PackageVersion.Windows81, "Square30x30Logo"
+ },
+ {
+ PackageVersion.Windows8, "SmallLogo"
+ },
+ };
+
+ private static readonly Dictionary bigLogoNameFromVersion = new()
+ {
+ {
+ PackageVersion.Windows10, "Square150x150Logo"
+ },
+ {
+ PackageVersion.Windows81, "Square150x150Logo"
+ },
+ {
+ PackageVersion.Windows8, "Logo"
+ },
+ };
+
+ public static Application[] All(Settings settings)
+ {
+ var support = SupportUWP();
+ if (support && settings.EnableUWP)
{
var applications = CurrentUserPackages().AsParallel().SelectMany(p =>
{
@@ -153,13 +210,13 @@ namespace Flow.Launcher.Plugin.Program.Programs
try
{
u = new UWP(p);
+ u.InitAppsInPackage(p);
}
#if !DEBUG
catch (Exception e)
{
- ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occured and "
- + $"unable to convert Package to UWP for {p.Id.FullName}", e);
- return new Application[] { };
+ ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occurred and unable to convert Package to UWP for {p.Id.FullName}", e);
+ return Array.Empty();
}
#endif
#if DEBUG //make developer aware and implement handling
@@ -172,61 +229,97 @@ namespace Flow.Launcher.Plugin.Program.Programs
}).ToArray();
var updatedListWithoutDisabledApps = applications
- .Where(t1 => !Main._settings.DisabledProgramSources
- .Any(x => x.UniqueIdentifier == t1.UniqueIdentifier))
- .Select(x => x);
+ .Where(t1 => !Main._settings.DisabledProgramSources
+ .Any(x => x.UniqueIdentifier == t1.UniqueIdentifier));
return updatedListWithoutDisabledApps.ToArray();
}
else
{
- return new Application[] { };
+ return Array.Empty();
}
}
+ public static bool SupportUWP()
+ {
+ var windows10 = new Version(10, 0);
+ var support = Environment.OSVersion.Version.Major >= windows10.Major;
+ return support;
+ }
+
private static IEnumerable CurrentUserPackages()
{
- var u = WindowsIdentity.GetCurrent().User;
+ var user = WindowsIdentity.GetCurrent().User;
- if (u != null)
+ if (user != null)
{
- var id = u.Value;
- PackageManager m;
+ var userId = user.Value;
+ PackageManager packageManager;
try
{
- m = new PackageManager();
+ packageManager = new PackageManager();
}
catch
{
// Bug from https://github.com/microsoft/CsWinRT, using Microsoft.Windows.SDK.NET.Ref 10.0.19041.0.
// Only happens on the first time, so a try catch can fix it.
- m = new PackageManager();
+ packageManager = new PackageManager();
}
- var ps = m.FindPackagesForUser(id);
- ps = ps.Where(p =>
+ var packages = packageManager.FindPackagesForUser(userId);
+ packages = packages.Where(p =>
{
- bool valid;
try
{
var f = p.IsFramework;
var d = p.IsDevelopmentMode;
var path = p.InstalledLocation.Path;
- valid = !f && !d && !string.IsNullOrEmpty(path);
+ return !f && !d && !string.IsNullOrEmpty(path);
}
catch (Exception e)
{
- ProgramLogger.LogException("UWP", "CurrentUserPackages", $"id", "An unexpected error occured and "
- + $"unable to verify if package is valid", e);
+ ProgramLogger.LogException("UWP", "CurrentUserPackages", $"{p.Id.FullName}", "An unexpected error occurred and "
+ + $"unable to verify if package is valid", e);
return false;
}
-
- return valid;
});
- return ps;
+ return packages;
}
else
{
- return new Package[] { };
+ return Array.Empty();
+ }
+ }
+
+ private static Channel PackageChangeChannel = Channel.CreateBounded(1);
+
+ public static async Task WatchPackageChange()
+ {
+ if (Environment.OSVersion.Version.Major >= 10)
+ {
+ var catalog = PackageCatalog.OpenForCurrentUser();
+ catalog.PackageInstalling += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+ catalog.PackageUninstalling += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+ catalog.PackageUpdating += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+
+ while (await PackageChangeChannel.Reader.WaitToReadAsync().ConfigureAwait(false))
+ {
+ await Task.Delay(3000).ConfigureAwait(false);
+ PackageChangeChannel.Reader.TryRead(out _);
+ await Task.Run(Main.IndexUwpPrograms);
+ }
+
}
}
@@ -255,26 +348,29 @@ namespace Flow.Launcher.Plugin.Program.Programs
[Serializable]
public class Application : IProgram
{
- public string AppListEntry { get; set; }
- public string UniqueIdentifier { get; set; }
- public string DisplayName { get; set; }
- public string Description { get; set; }
- public string UserModelId { get; set; }
- public string BackgroundColor { get; set; }
-
- public string EntryPoint { get; set; }
+ private string _uid = string.Empty;
+ public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); }
+ public string DisplayName { get; set; } = string.Empty;
+ public string Description { get; set; } = string.Empty;
+ public string UserModelId { get; set; } = string.Empty;
+ //public string BackgroundColor { get; set; } = string.Empty; // preserve for future use
public string Name => DisplayName;
- public string Location => Package.Location;
+ public string Location { get; set; } = string.Empty;
- public bool Enabled { get; set; }
- public bool CanRunElevated { get; set; }
-
- public string LogoUri { get; set; }
- public string LogoPath { get; set; }
- public UWP Package { get; set; }
-
- public Application() { }
+ public bool Enabled { get; set; } = false;
+ public bool CanRunElevated { get; set; } = false;
+ public string LogoPath { get; set; } = string.Empty;
+ public string PreviewImagePath { get; set; } = string.Empty;
+ public Application(AppListEntry appListEntry, UWP package)
+ {
+ UserModelId = appListEntry.AppUserModelId;
+ UniqueIdentifier = appListEntry.AppUserModelId;
+ DisplayName = appListEntry.DisplayInfo.DisplayName;
+ Description = appListEntry.DisplayInfo.Description;
+ Location = package.Location;
+ Enabled = true;
+ }
public Result Result(string query, IPublicAPI api)
{
@@ -282,40 +378,45 @@ namespace Flow.Launcher.Plugin.Program.Programs
MatchResult matchResult;
// We suppose Name won't be null
- if (!Main._settings.EnableDescription || Description == null || Name.StartsWith(Description))
+ if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) || Name.Equals(Description))
{
title = Name;
- matchResult = StringMatcher.FuzzySearch(query, title);
- }
- else if (Description.StartsWith(Name))
- {
- title = Description;
- matchResult = StringMatcher.FuzzySearch(query, Description);
+ matchResult = StringMatcher.FuzzySearch(query, Name);
}
else
{
title = $"{Name}: {Description}";
var nameMatch = StringMatcher.FuzzySearch(query, Name);
- var desciptionMatch = StringMatcher.FuzzySearch(query, Description);
- if (desciptionMatch.Score > nameMatch.Score)
+ var descriptionMatch = StringMatcher.FuzzySearch(query, Description);
+ if (descriptionMatch.Score > nameMatch.Score)
{
- for (int i = 0; i < desciptionMatch.MatchData.Count; i++)
+ for (int i = 0; i < descriptionMatch.MatchData.Count; i++)
{
- desciptionMatch.MatchData[i] += Name.Length + 2; // 2 is ": "
+ descriptionMatch.MatchData[i] += Name.Length + 2; // 2 is ": "
}
- matchResult = desciptionMatch;
+ matchResult = descriptionMatch;
+ }
+ else
+ {
+ matchResult = nameMatch;
}
- else matchResult = nameMatch;
}
- if (!matchResult.Success)
+ if (!matchResult.IsSearchPrecisionScoreMet())
return null;
var result = new Result
{
Title = title,
- SubTitle = Main._settings.HideAppsPath ? string.Empty : Package.Location,
- Icon = Logo,
+ AutoCompleteText = Name,
+ SubTitle = Main._settings.HideAppsPath ? string.Empty : Location,
+ IcoPath = LogoPath,
+ Preview = new Result.PreviewInfo
+ {
+ IsMedia = false,
+ PreviewImagePath = PreviewImagePath,
+ Description = Description
+ },
Score = matchResult.Score,
TitleHighlightData = matchResult.MatchData,
ContextData = this,
@@ -326,22 +427,15 @@ namespace Flow.Launcher.Plugin.Program.Programs
e.SpecialKeyState.ShiftPressed &&
!e.SpecialKeyState.AltPressed &&
!e.SpecialKeyState.WinPressed
- );
+ );
- if (elevated && CanRunElevated)
+ bool shouldRunElevated = elevated && CanRunElevated;
+ _ = Task.Run(() => Launch(shouldRunElevated)).ConfigureAwait(false);
+ if (elevated && !shouldRunElevated)
{
- LaunchElevated();
- }
- else
- {
- Launch(api);
-
- if (elevated)
- {
- var title = "Plugin: Program";
- var message = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator_not_supported_message");
- api.ShowMsg(title, message, string.Empty);
- }
+ var title = api.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
+ var message = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator_not_supported_message");
+ api.ShowMsg(title, message, string.Empty);
}
return true;
@@ -359,14 +453,12 @@ namespace Flow.Launcher.Plugin.Program.Programs
new Result
{
Title = api.GetTranslation("flowlauncher_plugin_program_open_containing_folder"),
-
Action = _ =>
{
- Main.Context.API.OpenDirectory(Package.Location);
+ Main.Context.API.OpenDirectory(Location);
return true;
},
-
IcoPath = "Images/folder.png"
}
};
@@ -378,7 +470,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
Title = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator"),
Action = _ =>
{
- LaunchElevated();
+ Task.Run(() => Launch(true)).ConfigureAwait(false);
return true;
},
IcoPath = "Images/cmd.png"
@@ -388,317 +480,243 @@ namespace Flow.Launcher.Plugin.Program.Programs
return contextMenus;
}
- private async void Launch(IPublicAPI api)
+ private void Launch(bool elevated = false)
{
- var appManager = new ApplicationActivationHelper.ApplicationActivationManager();
- const string noArgs = "";
- const ApplicationActivationHelper.ActivateOptions noFlags = ApplicationActivationHelper.ActivateOptions.None;
- await Task.Run(() =>
- {
- try
- {
- appManager.ActivateApplication(UserModelId, noArgs, noFlags, out _);
- }
- catch (Exception)
- {
- var name = "Plugin: Program";
- var message = $"Can't start UWP: {DisplayName}";
- api.ShowMsg(name, message, string.Empty);
- }
- });
- }
-
- private async void LaunchElevated()
- {
- string command = "shell:AppsFolder\\" + UniqueIdentifier;
+ string command = "shell:AppsFolder\\" + UserModelId;
command = Environment.ExpandEnvironmentVariables(command.Trim());
var info = new ProcessStartInfo(command)
{
UseShellExecute = true,
- Verb = "runas",
+ Verb = elevated ? "runas" : ""
};
Main.StartProcess(Process.Start, info);
}
- public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP package)
+ internal static bool IfAppCanRunElevated(XmlNode appNode)
{
- // This is done because we cannot use the keyword 'out' along with a property
+ // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
+ // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
- manifestApp.GetAppUserModelId(out string tmpUserModelId);
- manifestApp.GetAppUserModelId(out string tmpUniqueIdentifier);
- manifestApp.GetStringValue("DisplayName", out string tmpDisplayName);
- manifestApp.GetStringValue("Description", out string tmpDescription);
- manifestApp.GetStringValue("BackgroundColor", out string tmpBackgroundColor);
- manifestApp.GetStringValue("EntryPoint", out string tmpEntryPoint);
-
- UserModelId = tmpUserModelId;
- UniqueIdentifier = tmpUniqueIdentifier;
- DisplayName = tmpDisplayName;
- Description = tmpDescription;
- BackgroundColor = tmpBackgroundColor;
- EntryPoint = tmpEntryPoint;
-
- Package = package;
-
- DisplayName = ResourceFromPri(package.FullName, package.Name, DisplayName);
- Description = ResourceFromPri(package.FullName, package.Name, Description);
- LogoUri = LogoUriFromManifest(manifestApp);
- LogoPath = LogoPathFromUri(LogoUri);
-
- Enabled = true;
- CanRunElevated = CanApplicationRunElevated();
+ return appNode?.Attributes["EntryPoint"]?.Value == "Windows.FullTrustApplication" ||
+ appNode?.Attributes["uap10:TrustLevel"]?.Value == "mediumIL";
}
- private bool CanApplicationRunElevated()
- {
- if (EntryPoint == "Windows.FullTrustApplication")
- {
- return true;
- }
-
- var manifest = Package.Location + "\\AppxManifest.xml";
- if (File.Exists(manifest))
- {
- var file = File.ReadAllText(manifest);
-
- if (file.Contains("TrustLevel=\"mediumIL\"", StringComparison.OrdinalIgnoreCase))
- {
- return true;
- }
- }
-
- return false;
- }
-
- internal string ResourceFromPri(string packageFullName, string packageName, string rawReferenceValue)
- {
- if (string.IsNullOrWhiteSpace(rawReferenceValue) || !rawReferenceValue.StartsWith("ms-resource:"))
- return rawReferenceValue;
-
- var formattedPriReference = FormattedPriReferenceValue(packageName, rawReferenceValue);
-
- var outBuffer = new StringBuilder(128);
- string source = $"@{{{packageFullName}? {formattedPriReference}}}";
- var capacity = (uint)outBuffer.Capacity;
- var hResult = SHLoadIndirectString(source, outBuffer, capacity, IntPtr.Zero);
- if (hResult == Hresult.Ok)
- {
- var loaded = outBuffer.ToString();
- if (!string.IsNullOrEmpty(loaded))
- {
- return loaded;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|ResourceFromPri|{Package.Location}|Can't load null or empty result "
- + $"pri {source} in uwp location {Package.Location}", new NullReferenceException());
- return string.Empty;
- }
- }
- else
- {
- var e = Marshal.GetExceptionForHR((int)hResult);
- ProgramLogger.LogException($"|UWP|ResourceFromPri|{Package.Location}|Load pri failed {source} with HResult {hResult} and location {Package.Location}", e);
- return string.Empty;
- }
- }
-
- public string FormattedPriReferenceValue(string packageName, string rawPriReferenceValue)
- {
- const string prefix = "ms-resource:";
-
- if (string.IsNullOrWhiteSpace(rawPriReferenceValue) || !rawPriReferenceValue.StartsWith(prefix))
- return rawPriReferenceValue;
-
- string key = rawPriReferenceValue.Substring(prefix.Length);
- if (key.StartsWith("//"))
- return $"{prefix}{key}";
-
- if (!key.StartsWith("/"))
- {
- key = $"/{key}";
- }
-
- if (!key.ToLower().Contains("resources"))
- {
- key = $"/Resources{key}";
- }
-
- return $"{prefix}//{packageName}{key}";
- }
-
- internal string LogoUriFromManifest(AppxPackageHelper.IAppxManifestApplication app)
- {
- var logoKeyFromVersion = new Dictionary
- {
- { PackageVersion.Windows10, "Square44x44Logo" },
- { PackageVersion.Windows81, "Square30x30Logo" },
- { PackageVersion.Windows8, "SmallLogo" },
- };
- if (logoKeyFromVersion.ContainsKey(Package.Version))
- {
- var key = logoKeyFromVersion[Package.Version];
- app.GetStringValue(key, out string logoUri);
- return logoUri;
- }
- else
- {
- return string.Empty;
- }
- }
-
- internal string LogoPathFromUri(string uri)
+ internal string LogoPathFromUri(string uri, (int, int) desiredSize)
{
// all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
// windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
// windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
// windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
- string path;
- if (uri.Contains("\\"))
+ if (string.IsNullOrWhiteSpace(uri))
{
- path = Path.Combine(Package.Location, uri);
- }
- else
- {
- // for C:\Windows\MiracastView etc
- path = Path.Combine(Package.Location, "Assets", uri);
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} 's logo uri is null or empty: {Location}", new ArgumentException("uri"));
+ return string.Empty;
}
- var extension = Path.GetExtension(path);
- if (extension != null)
+ string path = Path.Combine(Location, uri);
+
+ var pxCount = desiredSize.Item1 * desiredSize.Item2;
+ var logoPath = TryToFindLogo(uri, path, pxCount);
+ if (logoPath == string.Empty)
{
- var end = path.Length - extension.Length;
- var prefix = path.Substring(0, end);
- var paths = new List { path };
-
- var scaleFactors = new Dictionary>
+ var tmp = Path.Combine(Location, "Assets", uri);
+ if (!path.Equals(tmp, StringComparison.OrdinalIgnoreCase))
{
- // scale factors on win10: https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets#asset-size-tables,
- { PackageVersion.Windows10, new List { 100, 125, 150, 200, 400 } },
- { PackageVersion.Windows81, new List { 100, 120, 140, 160, 180 } },
- { PackageVersion.Windows8, new List { 100 } }
- };
-
- if (scaleFactors.ContainsKey(Package.Version))
- {
- foreach (var factor in scaleFactors[Package.Version])
- {
- paths.Add($"{prefix}.scale-{factor}{extension}");
- }
+ // TODO: Don't know why, just keep it at the moment
+ // Maybe on older version of Windows 10?
+ // for C:\Windows\MiracastView etc
+ return TryToFindLogo(uri, tmp, pxCount);
}
+ }
+ return logoPath;
- var selected = paths.FirstOrDefault(File.Exists);
- if (!string.IsNullOrEmpty(selected))
+ string TryToFindLogo(string uri, string path, int px)
+ {
+ var extension = Path.GetExtension(path);
+ if (extension != null)
{
- return selected;
+ //if (File.Exists(path))
+ //{
+ // return path; // shortcut, avoid enumerating files
+ //}
+
+ var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44
+ var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets
+ if (String.IsNullOrEmpty(logoNamePrefix) || !Directory.Exists(logoDir))
+ {
+ // Known issue: Edge always triggers it since logo is not at uri
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Location}", new FileNotFoundException());
+ return string.Empty;
+ }
+
+ var logos = Directory.EnumerateFiles(logoDir, $"{logoNamePrefix}*{extension}");
+
+ // Currently we don't care which one to choose
+ // Just ignore all qualifiers
+ // select like logo.[xxx_yyy].png
+ // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
+
+ // todo select from file name like pt run
+ var selected = logos.FirstOrDefault();
+ var closest = selected;
+ int min = int.MaxValue;
+ foreach (var logo in logos)
+ {
+
+ var imageStream = File.OpenRead(logo);
+ var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);
+ var height = decoder.Frames[0].PixelHeight;
+ var width = decoder.Frames[0].PixelWidth;
+ int pixelCountDiff = Math.Abs(height * width - px);
+ if (pixelCountDiff < min)
+ {
+ // try to find the closest to desired size
+ closest = logo;
+ if (pixelCountDiff == 0)
+ break; // found
+ min = pixelCountDiff;
+ }
+ }
+
+ selected = closest;
+ if (!string.IsNullOrEmpty(selected))
+ {
+ return selected;
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Location}", new FileNotFoundException());
+ return string.Empty;
+ }
}
else
{
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
- $"|{UserModelId} can't find logo uri for {uri} in package location: {Package.Location}", new FileNotFoundException());
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|Unable to find extension from {uri} for {UserModelId} " +
+ $"in package location {Location}", new FileNotFoundException());
return string.Empty;
}
}
- else
- {
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Package.Location}" +
- $"|Unable to find extension from {uri} for {UserModelId} " +
- $"in package location {Package.Location}", new FileNotFoundException());
- return string.Empty;
- }
}
- public ImageSource Logo()
- {
- var logo = ImageFromPath(LogoPath);
- var plated = PlatedImage(logo);
+ #region logo legacy
+ // preserve for potential future use
- // todo magic! temp fix for cross thread object
- plated.Freeze();
- return plated;
- }
+ //public ImageSource Logo()
+ //{
+ // var logo = ImageFromPath(LogoPath);
+ // var plated = PlatedImage(logo); // TODO: maybe get plated directly from app package?
+ // // todo magic! temp fix for cross thread object
+ // plated.Freeze();
+ // return plated;
+ //}
+ //private BitmapImage ImageFromPath(string path)
+ //{
+ // if (File.Exists(path))
+ // {
+ // var image = new BitmapImage();
+ // image.BeginInit();
+ // image.UriSource = new Uri(path);
+ // image.CacheOption = BitmapCacheOption.OnLoad;
+ // image.EndInit();
+ // image.Freeze();
+ // return image;
+ // }
+ // else
+ // {
+ // ProgramLogger.LogException($"|UWP|ImageFromPath|{(string.IsNullOrEmpty(path) ? "Not Available" : path)}" +
+ // $"|Unable to get logo for {UserModelId} from {path} and" +
+ // $" located in {Location}", new FileNotFoundException());
+ // return new BitmapImage(new Uri(Constant.MissingImgIcon));
+ // }
+ //}
- private BitmapImage ImageFromPath(string path)
- {
- if (File.Exists(path))
- {
- var image = new BitmapImage(new Uri(path));
- return image;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|ImageFromPath|{(string.IsNullOrEmpty(path) ? "Not Avaliable" : path)}" +
- $"|Unable to get logo for {UserModelId} from {path} and" +
- $" located in {Package.Location}", new FileNotFoundException());
- return new BitmapImage(new Uri(Constant.MissingImgIcon));
- }
- }
+ //private ImageSource PlatedImage(BitmapImage image)
+ //{
+ // if (!string.IsNullOrEmpty(BackgroundColor) && BackgroundColor != "transparent")
+ // {
+ // var width = image.Width;
+ // var height = image.Height;
+ // var x = 0;
+ // var y = 0;
- private ImageSource PlatedImage(BitmapImage image)
- {
- if (!string.IsNullOrEmpty(BackgroundColor) && BackgroundColor != "transparent")
- {
- var width = image.Width;
- var height = image.Height;
- var x = 0;
- var y = 0;
+ // var group = new DrawingGroup();
- var group = new DrawingGroup();
+ // var converted = ColorConverter.ConvertFromString(BackgroundColor);
+ // if (converted != null)
+ // {
+ // var color = (Color)converted;
+ // var brush = new SolidColorBrush(color);
+ // var pen = new Pen(brush, 1);
+ // var backgroundArea = new Rect(0, 0, width, width);
+ // var rectangle = new RectangleGeometry(backgroundArea);
+ // var rectDrawing = new GeometryDrawing(brush, pen, rectangle);
+ // group.Children.Add(rectDrawing);
- var converted = ColorConverter.ConvertFromString(BackgroundColor);
- if (converted != null)
- {
- var color = (Color)converted;
- var brush = new SolidColorBrush(color);
- var pen = new Pen(brush, 1);
- var backgroundArea = new Rect(0, 0, width, width);
- var rectabgle = new RectangleGeometry(backgroundArea);
- var rectDrawing = new GeometryDrawing(brush, pen, rectabgle);
- group.Children.Add(rectDrawing);
+ // var imageArea = new Rect(x, y, image.Width, image.Height);
+ // var imageDrawing = new ImageDrawing(image, imageArea);
+ // group.Children.Add(imageDrawing);
- var imageArea = new Rect(x, y, image.Width, image.Height);
- var imageDrawing = new ImageDrawing(image, imageArea);
- group.Children.Add(imageDrawing);
+ // // http://stackoverflow.com/questions/6676072/get-system-drawing-bitmap-of-a-wpf-area-using-visualbrush
+ // var visual = new DrawingVisual();
+ // var context = visual.RenderOpen();
+ // context.DrawDrawing(group);
+ // context.Close();
+ // const int dpiScale100 = 96;
+ // var bitmap = new RenderTargetBitmap(
+ // Convert.ToInt32(width), Convert.ToInt32(height),
+ // dpiScale100, dpiScale100,
+ // PixelFormats.Pbgra32
+ // );
+ // bitmap.Render(visual);
+ // return bitmap;
+ // }
+ // else
+ // {
+ // ProgramLogger.LogException($"|UWP|PlatedImage|{Location}" +
+ // $"|Unable to convert background string {BackgroundColor} " +
+ // $"to color for {Location}", new InvalidOperationException());
- // http://stackoverflow.com/questions/6676072/get-system-drawing-bitmap-of-a-wpf-area-using-visualbrush
- var visual = new DrawingVisual();
- var context = visual.RenderOpen();
- context.DrawDrawing(group);
- context.Close();
- const int dpiScale100 = 96;
- var bitmap = new RenderTargetBitmap(
- Convert.ToInt32(width), Convert.ToInt32(height),
- dpiScale100, dpiScale100,
- PixelFormats.Pbgra32
- );
- bitmap.Render(visual);
- return bitmap;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|PlatedImage|{Package.Location}" +
- $"|Unable to convert background string {BackgroundColor} " +
- $"to color for {Package.Location}", new InvalidOperationException());
-
- return new BitmapImage(new Uri(Constant.MissingImgIcon));
- }
- }
- else
- {
- // todo use windows theme as background
- return image;
- }
- }
+ // return new BitmapImage(new Uri(Constant.MissingImgIcon));
+ // }
+ // }
+ // else
+ // {
+ // // todo use windows theme as background
+ // return image;
+ // }
+ //}
+ #endregion
public override string ToString()
{
return $"{DisplayName}: {Description}";
}
+
+ public override bool Equals(object obj)
+ {
+ if (obj is Application other)
+ {
+ return UniqueIdentifier == other.UniqueIdentifier;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ return UniqueIdentifier.GetHashCode();
+ }
}
public enum PackageVersion
@@ -708,25 +726,5 @@ namespace Flow.Launcher.Plugin.Program.Programs
Windows8,
Unknown
}
-
- [Flags]
- private enum Stgm : uint
- {
- Read = 0x0,
- ShareExclusive = 0x10,
- }
-
- private enum Hresult : uint
- {
- Ok = 0x0000,
- }
-
- [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
- private static extern Hresult SHCreateStreamOnFileEx(string fileName, Stgm grfMode, uint attributes, bool create,
- IStream reserved, out IStream stream);
-
- [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
- private static extern Hresult SHLoadIndirectString(string pszSource, StringBuilder pszOutBuf, uint cchOutBuf,
- IntPtr ppvReserved);
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
index 1464bd785..4afedb9e4 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -11,10 +11,11 @@ using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin.Program.Logger;
using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Plugin.SharedModels;
-using Flow.Launcher.Infrastructure.Logger;
using System.Diagnostics;
-using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
using System.Diagnostics.CodeAnalysis;
+using System.Threading.Channels;
+using Flow.Launcher.Plugin.Program.Views.Models;
+using IniParser;
namespace Flow.Launcher.Plugin.Program.Programs
{
@@ -22,19 +23,43 @@ namespace Flow.Launcher.Plugin.Program.Programs
public class Win32 : IProgram, IEquatable
{
public string Name { get; set; }
- public string UniqueIdentifier { get; set; }
+ public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); } // For path comparison
public string IcoPath { get; set; }
+
+ ///
+ /// Path of the file. It's the path of .lnk and .url for .lnk and .url files.
+ ///
public string FullPath { get; set; }
+
+ ///
+ /// Path of the executable for .lnk, or the URL for .url. Arguments are included if any.
+ ///
public string LnkResolvedPath { get; set; }
+
+ ///
+ /// Path of the actual executable file. Args are included.
+ ///
+ public string ExecutablePath => LnkResolvedPath ?? FullPath;
+
public string ParentDirectory { get; set; }
+
+ ///
+ /// Name of the executable for .lnk files
+ ///
public string ExecutableName { get; set; }
+
public string Description { get; set; }
public bool Valid { get; set; }
public bool Enabled { get; set; }
public string Location => ParentDirectory;
+ // Localized name based on windows display language
+ public string LocalizedName { get; set; } = string.Empty;
+
private const string ShortcutExtension = "lnk";
+ private const string UrlExtension = "url";
private const string ExeExtension = "exe";
+ private string _uid = string.Empty;
private static readonly Win32 Default = new Win32()
{
@@ -50,54 +75,94 @@ namespace Flow.Launcher.Plugin.Program.Programs
Enabled = false
};
+ private static MatchResult Match(string query, IReadOnlyCollection candidates)
+ {
+ if (candidates.Count == 0)
+ return null;
+
+ var match = candidates.Select(candidate => StringMatcher.FuzzySearch(query, candidate))
+ .MaxBy(match => match.Score);
+
+ return match?.IsSearchPrecisionScoreMet() ?? false ? match : null;
+ }
public Result Result(string query, IPublicAPI api)
{
string title;
MatchResult matchResult;
- // We suppose Name won't be null
- if (!Main._settings.EnableDescription || Description == null || Name.StartsWith(Description))
+ // Name of the result
+ // Check equality to avoid matching again in candidates
+ bool useLocalizedName = !string.IsNullOrEmpty(LocalizedName) && !Name.Equals(LocalizedName);
+ string resultName = useLocalizedName ? LocalizedName : Name;
+
+ if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) || resultName.Equals(Description))
{
- title = Name;
- matchResult = StringMatcher.FuzzySearch(query, title);
- }
- else if (Description.StartsWith(Name))
- {
- title = Description;
- matchResult = StringMatcher.FuzzySearch(query, Description);
+ title = resultName;
+ matchResult = StringMatcher.FuzzySearch(query, resultName);
}
else
{
- title = $"{Name}: {Description}";
- var nameMatch = StringMatcher.FuzzySearch(query, Name);
- var desciptionMatch = StringMatcher.FuzzySearch(query, Description);
- if (desciptionMatch.Score > nameMatch.Score)
+ // Search in both
+ title = $"{resultName}: {Description}";
+ var nameMatch = StringMatcher.FuzzySearch(query, resultName);
+ var descriptionMatch = StringMatcher.FuzzySearch(query, Description);
+ if (descriptionMatch.Score > nameMatch.Score)
{
- for (int i = 0; i < desciptionMatch.MatchData.Count; i++)
+ for (int i = 0; i < descriptionMatch.MatchData.Count; i++)
{
- desciptionMatch.MatchData[i] += Name.Length + 2; // 2 is ": "
+ descriptionMatch.MatchData[i] += resultName.Length + 2; // 2 is ": "
}
- matchResult = desciptionMatch;
+ matchResult = descriptionMatch;
+ }
+ else
+ {
+ matchResult = nameMatch;
}
- else matchResult = nameMatch;
}
+ List candidates = new List();
+
if (!matchResult.IsSearchPrecisionScoreMet())
{
if (ExecutableName != null) // only lnk program will need this one
- matchResult = StringMatcher.FuzzySearch(query, ExecutableName);
-
- if (!matchResult.IsSearchPrecisionScoreMet())
+ {
+ candidates.Add(ExecutableName);
+ }
+ if (useLocalizedName)
+ {
+ candidates.Add(Name);
+ }
+ matchResult = Match(query, candidates);
+ if (matchResult == null)
+ {
return null;
+ }
+ else
+ {
+ // Nothing to highlight in title in this case
+ matchResult.MatchData.Clear();
+ }
+ }
- matchResult.MatchData = new List();
+ string subtitle = string.Empty;
+ if (!Main._settings.HideAppsPath)
+ {
+ if (Extension(FullPath) == UrlExtension)
+ {
+ subtitle = LnkResolvedPath;
+ }
+ else
+ {
+ subtitle = FullPath;
+ }
}
var result = new Result
{
Title = title,
- SubTitle = Main._settings.HideAppsPath ? string.Empty : LnkResolvedPath ?? FullPath,
+ AutoCompleteText = resultName,
+ SubTitle = subtitle,
IcoPath = IcoPath,
Score = matchResult.Score,
TitleHighlightData = matchResult.MatchData,
@@ -109,17 +174,17 @@ namespace Flow.Launcher.Plugin.Program.Programs
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
- );
+ );
var info = new ProcessStartInfo
{
- FileName = LnkResolvedPath ?? FullPath,
+ FileName = FullPath,
WorkingDirectory = ParentDirectory,
UseShellExecute = true,
- Verb = runAsAdmin ? "runas" : null
+ Verb = runAsAdmin ? "runas" : ""
};
- Task.Run(() => Main.StartProcess(Process.Start, info));
+ _ = Task.Run(() => Main.StartProcess(Process.Start, info));
return true;
}
@@ -140,8 +205,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
var info = new ProcessStartInfo
{
- FileName = FullPath,
- WorkingDirectory = ParentDirectory,
+ FileName = FullPath,
+ WorkingDirectory = ParentDirectory,
UseShellExecute = true
};
@@ -194,6 +259,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
return Name;
}
+ private static List Watchers = new List();
+
private static Win32 Win32Program(string path)
{
try
@@ -216,8 +283,17 @@ namespace Flow.Launcher.Plugin.Program.Programs
ProgramLogger.LogException($"|Win32|Win32Program|{path}" +
$"|Permission denied when trying to load the program from {path}", e);
- return new Win32() { Valid = false, Enabled = false };
+ return Default;
}
+#if !DEBUG
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|Win32|Win32Program|{path}" +
+ "|An unexpected error occurred in the calling method Win32Program", e);
+
+ return Default;
+ }
+#endif
}
private static Win32 LnkProgram(string path)
@@ -230,42 +306,42 @@ namespace Flow.Launcher.Plugin.Program.Programs
ShellLinkHelper _helper = new ShellLinkHelper();
string target = _helper.retrieveTargetPath(path);
- if (!string.IsNullOrEmpty(target))
+ if (!string.IsNullOrEmpty(target) && File.Exists(target))
{
- var extension = Extension(target);
- if (extension == ExeExtension && File.Exists(target))
- {
- program.LnkResolvedPath = program.FullPath;
- program.FullPath = Path.GetFullPath(target).ToLower();
- program.ExecutableName = Path.GetFileName(target);
+ program.LnkResolvedPath = Path.GetFullPath(target);
+ program.ExecutableName = Path.GetFileName(target);
- var description = _helper.description;
- if (!string.IsNullOrEmpty(description))
+ var args = _helper.arguments;
+ if (!string.IsNullOrEmpty(args))
+ {
+ program.LnkResolvedPath += " " + args;
+ }
+
+ var description = _helper.description;
+ if (!string.IsNullOrEmpty(description))
+ {
+ program.Description = description;
+ }
+ else
+ {
+ var info = FileVersionInfo.GetVersionInfo(target);
+ if (!string.IsNullOrEmpty(info.FileDescription))
{
- program.Description = description;
- }
- else
- {
- var info = FileVersionInfo.GetVersionInfo(target);
- if (!string.IsNullOrEmpty(info.FileDescription))
- {
- program.Description = info.FileDescription;
- }
+ program.Description = info.FileDescription;
}
}
}
+ program.LocalizedName = ShellLocalization.GetLocalizedName(path);
+
return program;
}
- catch (COMException e)
+ catch (FileNotFoundException e)
{
- // C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\MiracastView.lnk always cause exception
ProgramLogger.LogException($"|Win32|LnkProgram|{path}" +
- "|Error caused likely due to trying to get the description of the program",
- e);
+ "|An unexpected error occurred in the calling method LnkProgram", e);
- program.Valid = false;
- return program;
+ return Default;
}
#if !DEBUG //Only do a catch all in production. This is so make developer aware of any unhandled exception and add the exception handling in.
catch (Exception e)
@@ -273,12 +349,51 @@ namespace Flow.Launcher.Plugin.Program.Programs
ProgramLogger.LogException($"|Win32|LnkProgram|{path}" +
"|An unexpected error occurred in the calling method LnkProgram", e);
- program.Valid = false;
- return program;
+ return Default;
}
#endif
}
+ private static Win32 UrlProgram(string path, string[] protocols)
+ {
+ var program = Win32Program(path);
+ program.Valid = false;
+
+ try
+ {
+ var parser = new FileIniDataParser();
+ var data = parser.ReadFile(path);
+ var urlSection = data["InternetShortcut"];
+ var url = urlSection?["URL"];
+ if (String.IsNullOrEmpty(url))
+ {
+ return program;
+ }
+
+ foreach (var protocol in protocols)
+ {
+ if (url.StartsWith(protocol))
+ {
+ program.LnkResolvedPath = url;
+ program.Valid = true;
+ break;
+ }
+ }
+
+ var iconPath = urlSection?["IconFile"];
+ if (!String.IsNullOrEmpty(iconPath))
+ {
+ program.IcoPath = iconPath;
+ }
+ }
+ catch (Exception e)
+ {
+ // Many files do not have the required fields, so no logging is done.
+ }
+
+ return program;
+ }
+
private static Win32 ExeProgram(string path)
{
try
@@ -289,33 +404,39 @@ namespace Flow.Launcher.Plugin.Program.Programs
program.Description = info.FileDescription;
return program;
}
+ catch (FileNotFoundException e)
+ {
+ ProgramLogger.LogException($"|Win32|ExeProgram|{path}" +
+ $"|File not found when trying to load the program from {path}", e);
+
+ return Default;
+ }
catch (Exception e) when (e is SecurityException || e is UnauthorizedAccessException)
{
ProgramLogger.LogException($"|Win32|ExeProgram|{path}" +
$"|Permission denied when trying to load the program from {path}", e);
- return new Win32() { Valid = false, Enabled = false };
+ return Default;
}
}
- private static IEnumerable ProgramPaths(string directory, string[] suffixes)
+ private static IEnumerable EnumerateProgramsInDir(string directory, string[] suffixes, bool recursive = true)
{
if (!Directory.Exists(directory))
return Enumerable.Empty();
- return Directory.EnumerateFiles(directory, "*", new EnumerationOptions
- {
- IgnoreInaccessible = true,
- RecurseSubdirectories = true
- }).Where(x => suffixes.Contains(Extension(x)));
+ return Directory.EnumerateFiles(
+ directory, "*",
+ new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = recursive })
+ .Where(x => suffixes.Contains(Extension(x)));
}
private static string Extension(string path)
{
- var extension = Path.GetExtension(path)?.ToLower();
+ var extension = Path.GetExtension(path)?.ToLowerInvariant();
if (!string.IsNullOrEmpty(extension))
{
- return extension.Substring(1);
+ return extension.Substring(1); // remove dot
}
else
{
@@ -323,44 +444,48 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
}
- private static IEnumerable UnregisteredPrograms(List sources, string[] suffixes)
+ private static IEnumerable UnregisteredPrograms(List directories, string[] suffixes, string[] protocols)
{
- var paths = ExceptDisabledSource(sources.Where(s => Directory.Exists(s.Location) && s.Enabled)
- .SelectMany(s => ProgramPaths(s.Location, suffixes)), x => x)
+ // Disabled custom sources are not in DisabledProgramSources
+ var paths = directories.AsParallel()
+ .SelectMany(s => EnumerateProgramsInDir(s, suffixes));
+
+ // Remove disabled programs in DisabledProgramSources
+ var programs = ExceptDisabledSource(paths).Select(x => GetProgramFromPath(x, protocols));
+ return programs;
+ }
+
+ private static IEnumerable StartMenuPrograms(string[] suffixes, string[] protocols)
+ {
+ var allPrograms = GetStartMenuPaths()
+ .SelectMany(p => EnumerateProgramsInDir(p, suffixes))
.Distinct();
- var programs = paths.Select(x => Extension(x) switch
- {
- ExeExtension => ExeProgram(x),
- ShortcutExtension => LnkProgram(x),
- _ => Win32Program(x)
- });
-
-
+ var programs = ExceptDisabledSource(allPrograms)
+ .Select(x => GetProgramFromPath(x, protocols));
return programs;
}
- private static IEnumerable StartMenuPrograms(string[] suffixes)
+ private static IEnumerable PATHPrograms(string[] suffixes, string[] protocols, List commonParents)
{
- var disabledProgramsList = Main._settings.DisabledProgramSources;
+ var pathEnv = Environment.GetEnvironmentVariable("Path");
+ if (String.IsNullOrEmpty(pathEnv))
+ {
+ return Array.Empty();
+ }
- var directory1 = Environment.GetFolderPath(Environment.SpecialFolder.Programs);
- var directory2 = Environment.GetFolderPath(Environment.SpecialFolder.CommonPrograms);
- var paths1 = ProgramPaths(directory1, suffixes);
- var paths2 = ProgramPaths(directory2, suffixes);
+ var paths = pathEnv.Split(";", StringSplitOptions.RemoveEmptyEntries).DistinctBy(p => p.ToLowerInvariant());
- var toFilter = paths1.Concat(paths2);
+ var toFilter = paths.Where(x => commonParents.All(parent => !FilesFolders.PathContains(parent, x)))
+ .AsParallel()
+ .SelectMany(p => EnumerateProgramsInDir(p, suffixes, recursive: false));
var programs = ExceptDisabledSource(toFilter.Distinct())
- .Select(x => Extension(x) switch
- {
- ShortcutExtension => LnkProgram(x),
- _ => Win32Program(x)
- }).Where(x => x.Valid);
+ .Select(x => GetProgramFromPath(x, protocols));
return programs;
}
- private static IEnumerable AppPathsPrograms(string[] suffixes)
+ private static IEnumerable AppPathsPrograms(string[] suffixes, string[] protocols)
{
// https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121
const string appPaths = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";
@@ -380,12 +505,11 @@ namespace Flow.Launcher.Plugin.Program.Programs
toFilter = toFilter.Concat(GetPathFromRegistry(rootUser));
}
-
toFilter = toFilter.Distinct().Where(p => suffixes.Contains(Extension(p)));
- var filtered = ExceptDisabledSource(toFilter);
-
- return filtered.Select(GetProgramFromPath).ToList(); // ToList due to disposing issue
+ var programs = ExceptDisabledSource(toFilter)
+ .Select(x => GetProgramFromPath(x, protocols)).Where(x => x.Valid).ToList(); // ToList due to disposing issue
+ return programs;
}
private static IEnumerable GetPathFromRegistry(RegistryKey root)
@@ -396,12 +520,12 @@ namespace Flow.Launcher.Plugin.Program.Programs
.Distinct();
}
- private static string GetProgramPathFromRegistrySubKeys(RegistryKey root, string subkey)
+ private static string GetProgramPathFromRegistrySubKeys(RegistryKey root, string subKey)
{
var path = string.Empty;
try
{
- using (var key = root.OpenSubKey(subkey))
+ using (var key = root.OpenSubKey(subKey))
{
if (key == null)
return string.Empty;
@@ -425,24 +549,26 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
}
- private static Win32 GetProgramFromPath(string path)
+ private static Win32 GetProgramFromPath(string path, string[] protocols)
{
if (string.IsNullOrEmpty(path))
return Default;
path = Environment.ExpandEnvironmentVariables(path);
- if (!File.Exists(path))
- return Default;
-
- var entry = Win32Program(path);
-
- return entry;
+ return Extension(path) switch
+ {
+ ShortcutExtension => LnkProgram(path),
+ ExeExtension => ExeProgram(path),
+ UrlExtension => UrlProgram(path, protocols),
+ _ => Win32Program(path)
+ };
+ ;
}
- public static IEnumerable ExceptDisabledSource(IEnumerable sources)
+ public static IEnumerable ExceptDisabledSource(IEnumerable paths)
{
- return ExceptDisabledSource(sources, x => x);
+ return ExceptDisabledSource(paths, x => x.ToLowerInvariant());
}
public static IEnumerable ExceptDisabledSource(IEnumerable sources,
@@ -477,14 +603,15 @@ namespace Flow.Launcher.Plugin.Program.Programs
private static IEnumerable