Code Monkey home page Code Monkey logo

jl's Introduction

JL

JL is a program for looking up Japanese words and expressions. Inspired by Nazeka and Chiitrans Lite.

Download from the releases page. Prefer the x86 version for 50-80% less memory usage. Prefer the x64 version if you intend to use lots of dictionaries together because x86 programs cannot use more than 2 GB of RAM. The x86 version of JL can now use more than 2 GB of RAM (up to 4 GB) because it's marked as LARGEADDRESSAWARE.

IMPORTANT: If you are using Windows 7 and you intend to use EPWING dictionaries, you MUST use the x86 version because of a .NET bug. See the link for more details.

Screenshots

System requirements

  • Windows 7 or later
  • .NET Desktop Runtime 6.0 or later

Features

  • Highly customizable (i.e. You can change the size/color/opacity/hotkey of pretty much everything)
  • Custom word and name dictionaries
  • Supports lots of dictionaries (see the Supported Dictionaries page for details)
  • Pitch accent (needs a pitch accent dictionary such as Kanjium)
  • Allows customizing the displayed info per dictionary (not showing PoS info for JMdict, showing no/only one/all example sentences for Kenkyuusha, choosing whether to put newlines between definitions etc. through "Manage Dictionaries"->"Edit" button of the dictionary->"Options" section)
  • Can deconjugate verbs (see the Deconjugation Support page for the list of supported adjective and verb types)
  • Anki mining (allows different configurations for word/kanji/name mining)
  • Allows different opacity level on un/hover
  • Pass-through mode (i.e. mouse clicks will pass through JL)
  • Recursive lookups (i.e. popup within popup)
  • Remembers last window position
  • Halfwidth -> Fullwidth conversions (and vice-versa)
  • Hiragana -> Katakana conversions (and vice-versa)
  • Chouonpu conversions (e.g. can find 清掃 from セーソー)
  • Text normalization (e.g. can find 株式会社 when ㍿ is looked up)
  • Has a backlog (using the arrow keys will show items in the backlog one by one, scrolling up will show all the backlog at once)
  • Touch screen support (i.e. Left Click/Touch lookup mode)
  • Can work without stealing the focus away from other windows
  • Can keep itself as the topmost window (i.e. JL can be used with programs like Magpie)
  • Stats (read character/line count, spent time etc.)

FAQ

How does it work?

JL grabs the text from the clipboard by default. It can also be configured to capture it from a WebSocket.

You need another program to copy the text to the clipboard and/or to a WebSocket (e.g. Textractor for visual novels).

Why can't I look anything up?

Make sure you didn't disable lookups with the "Toggle lookup" hotkey. Also make sure that you have active dictionaries under Manage Dictionaries window.

Why can't I scroll down the results list?

You need to be in mining mode in order to interact with the popup window. "Left click/Touch" and "Text select" lookup modes will automatically activate the mining mode. If you are using the "Mouse move" lookup mode, you can activate the mining mode with a middle mouse click or with the mining mode hotkey (by default it's the key "M").

How do I disable pass-through mode?

Press the opacity slider button located top-left of the main window. You can also disable it with the same hotkey you've enabled it if you have the global hotkeys enabled and if its hotkey is a valid global hotkey. (Only hotkeys with modifiers (e.g. Alt+T), function keys (except for F12) and numpad keys can be used as global hotkeys.)

How can I use JL with Magpie?

Enable the "Preferences>General>Always on top" option. This option will make sure that JL is the topmost window on every clipboard change.

Optional: Give UI Access to JL. This allows JL to be on top of Magpie even before any clipboard change occurs. See UI Access page for more details.

Disable the "Preferences>Main Window>Focus on hover" option.

Disable the "Preferences>Popup>Focus on lookup" option.

Optional if you use the "Mouse move" look up mode, required otherwise: Disable the "Preferences>General>Focusable" option. When this option is disabled, JL won't steal the focus away from other windows, even in case of a mouse click. This allows you to open popups within popups without Magpie exiting the fullscreen mode. Note that if this option is disabled, you won't be able to use hotkeys unless you enable the global hotkeys option and assign valid global hotkeys, because JL won't have the keyboard focus. You can also use the middle mouse button to activate the mining mode.

How do I add EPWING dictionaries?

[Yomichan Import]

Select the folder containing the unzipped (so you should have a folder of files named like term_bank_1.json, term_bank_2.json...) contents of a dictionary converted with Yomichan Import, on the Manage Dictionaries window.

[Nazeka EPWING Converter]

Select the file you got from Nazeka EPWING Converter, on the Manage Dictionaries window.

Where are my settings stored?

  • Anki settings: Config/AnkiConfig.json
  • Audio source settings: Config/AudioSourceConfig.json
  • Dictionary settings: Config/dicts.json
  • Frequency settings: Config/freqs.json
  • Stats: Config/Stats.json
  • Everything else: JL.dll.config

Will you add machine translation capabilities?

No.

Credits

License

Licensed under the Apache License, Version 2.0

jl's People

Contributors

mertvn avatar rampaa avatar thovip119 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

jl's Issues

Let us choose the browser for lookups with 'S'

would be be nice if we could specify the browser in a config file or something instead of using the default browser.

  • personally i use different browser for different things. for example: one browser for language learning, another for google services, yet another for web browsing and so on and i have them open in different windows desktop environments as well.
  • only have the necessary add-ons in my language learning browser

App freezes few seconds after starting it

Ever since the last update, there are certain times when the app simply freezes right after launching it, regardless of whether you are just using the overlay window or have opened any of the settings menus. It works for like 5-8 seconds after launch and then completely stops responding. The only way out is to kill the app from task manager, but once this issue happens, subsequent relaunches of the app continue having this same issue, and the only way seems to be restarting windows to make it work again. Another info that I can give is that this happens regardless of whether textractor is running or not.

Sources of definitions / filter by source - Missing function ?

EDIT : I've found the answer to my own question : it's indeed the popup in mining mode. As I'm not mining (as in creating cards for Anki if I got it well), it didn't occur to me to enter mining mode and so I totally missed this function. Sorry for the bother.

First : thanks for you work, I discovered JL a few days ago and I'm using it since then.

I was reading another issue (#31) where I saw the screenshot posted by the user.

I see in the upper part of the popup what seem to be a list of the used dictionaries : I can only suppose that that shows the sources of the definitions currently displayed and allows one to filter as well (clicking on one dict would show only the entries belonging to that dict etc.).

I don't understand why, but I've no such functionality and I would love to. My only guess is that it could be linked to Anki integration, as to my knowledge it's the only function I'm not using. Can someone enlighten me ?

Bug report: priorities not handled correctly while configuring audio sources

JL doesn't update priority for existing if other sources are removed. Adding newer sources afterward can then end up saving the new source with the same priority as the existing ones. This ends up showing the new source as lower priority than the older source with the same priority on the UI and JL immediately crashes if you try to reorder such sources. Editing the config JSON directly to set the priority to 1,2,3 as desired solves the issue but I figured I might as well report this.

Simplest reproduction steps:

  1. Add local audio server as a source by adding http://127.0.0.1:5050/?term={Term}&reading={Reading}&sources=jpod,nhk16,shinmeikai8,forvo as a URL (JSON) source
  2. Add forvo server as a source by adding http://127.0.0.1:8770/?expression={Term}&reading={Reading} as a URL (JSON) source
  3. Reorder the two sources added to be above the default jpod source in the UI
  4. Remove the forvo server source
  5. Add a new audio source (just adding the forvo source back works too). It should show up below the jpod source, i.e., with the lowest priority
  6. Try to move the new audio source higher in priority from the UI. JL should crash.

My OS is win10-x64 on an intel chip fwiw. I didn't test on other systems.

Exposing api: Handlebars templating when creating cards

Many basic mining setups involve handlebars in the generated Anki cards. Yomi uses Handlebars internally to generate Anki cards, but allows modifying the template used, creating an API where users can modify the template to generate cards.

This is used in many setups, for example:

The API for yomichan can be found at https://github.com/themoeway/yomitan/blob/d1c694535113206ba059e83958c1e8c9addd10b2/ext/js/templates/sandbox/anki-template-renderer.js.

Is it possible to add templating support?

Previously looked up words keeps popping up when looking up another word inside dictionary popups

I'm currently making the monolingual transition with JL. and every time I try to look up multiple words inside the dictionary popup, it keeps showing the previously looked up word instead of the new one.

My current workaround for this is adding a delay to auto-hide popups (1000ms), then waiting it out until looking up the next word. I have a keybind set to close the popup windows, but I mainly use Magpie when reading VNs, and it prevents me from using keybinds in JL. A suggestion I could make for this is adding a close popup button to the popup windows.

Keep Focus while advancing dialog

JL should keep focus even after clicking into a VN to advance the dialog.

  • Want to be able keep using hotkeys, more efficient and convenient.
  • Adding a hotkey to advance the dialog would probably have the same effect.
  • something similar is already possible with (mousewheel) backlog.

Add a soft blinking animation to currently looked up words in text

A clean addition could be that if JL had a blinking animation for the currently looked up word. A soft blinking animation could be an unintrusive way of showing what is currently selected. Similar to how Yomichan look-ups highlight the text, JL could implement something similar to show what part of the text is currently being looked up.

An example of what I'm talking about -
CSS blinking animation example I found from Google:
https://codepen.io/bernheisel/pen/meOQxB
animation duration set to 2s.

Delete current logged line

Most hooks aren't perfect, and sometimes they can send more text than needed.

In my case, my hooks sends the entire backlog when i trigger it. This is annoying when doing it by accident as it inflates character count.

It would be nice to delete the last sent line (and deleting it from the statistics as well) to work around faulty hooks like this.

Idk if being able to delete every logged line is necessary; just the current one would be a big help.

Pop-up window grabs focus, disregarding setting.

steps to replicate:
-just use JL normally
-after some amount of time pop-up window grabs attention even with "focus on lookup" set to "off"
-bug disappears whenever i switch to another window / open settings, just like in video
Bug also occured even before 1.5 update.

2022-03-24.19-11-15.mp4

Autohide Popup

would be nice if the popup would hide after x amount of ms if the mouse isn´t hovered over it.

Autoupdater doesn't work in paths with spaces

(I'm testing JL as part of my continuous/ongoing effort to privately catalog Japanese learning tools)

Due to organizational error I have JL located in a directory whose global path has spaces in it: F:\from c\wareya\Desktop\READING\JL

When the application attempts to run the autoupdater, the following error window is raised:

explorer_2022-06-29_21-57-32

Running update-helper.cmd directly seems to work as it should, so this is most likely an issue with how the cmd script is being invoked.

Crash while managing dictionaries

Hello.

I've added a few Yomichan/EPWING dicts : here is the list.

Capture

This is probably not exhaustive as I've not tested every combinations, but in this setup I can reproduce the crash (systematically) by trying to move up Daijirin or Daijisen. I can move them as I want as long as I won't try to move them to the 5th position and up from the bottom (position occupied by JMDICT here). Of course, I've tried to remove them and add them up but the crashes occurred again.

As every dict (including Daijirin and Daijisen) are functional nevertheless, I'm using it in this state.

Dictionary Tabs should behave like browser tabs

dictionary tabs should have a dynamic width and should stay on the same row at all times, if possible.

  • cleaner more organized look. visual hierarchy and makes it easier to focus on the important parts

image

Support additional audio types

It seems like JL doesn't play some common audio file types so it bugs out with some of the sources from the local audio server. This has become a bigger problem now that the recommended data source has opus audio. You simply get a "Error playing Audio" error if you configure the local audio server as a source with the recommended data source now. FWIW, JL can play the alternative / older mp3 sources but some of the older sources were using .aac (in particular, the nhk and shinmeikai8 sources).

The workaround for now is to use the new mp3 sources. But it would be nice if JL could support playing other audio types. A canonical list of the types used by the local audio server are available here: https://github.com/themoeway/local-audio-yomichan/blob/dadd63feb35e89b9030fd18c036d59c45020436b/plugin/server.py#L28

(Logs suggest JL only supports mp3 audio fwiw.

System.IO.InvalidDataException: Invalid MP3 file - no MP3 Frames Detected
   at NAudio.Wave.Mp3FileReaderBase..ctor(Stream inputStream, FrameDecompressorBuilder frameDecompressorBuilder, Boolean ownInputStream)
   at JL.Windows.Utilities.WindowsUtils.<>c__DisplayClass56_0.<PlayAudio>b__0() in D:\a\JL\JL\JL.Windows\Utilities\WindowsUtils.cs:line 362

)

Better ordering of results

Currently, we sort results mainly by their frequency. This causes some words to have the wrong readings displayed in the first spot.
E.g.: 姉's first result should be あね, not ねえ

Adding Furigana to dictionary definitions

It would be ideal if the definition pop-up contained Furigana above the word being looked-up, as it helps associating a given kanji with its reading, in the same manner that Yomichan handles definitions.
Thank you for your amazing work, this software is a game changer in VN reading.

Arm64 release?

I build it by myself and run it without anything wrong. (about 800mb memory usage in taskmanager)

Do you willing publish arm version also? Thanks in advance!

Listen to hotkeys on an API endpoint / Add pause button

The only real hiccup I have with JL atm is around not being able to use hotkeys when it doesn't have focus. Using it with magpie requires that it not be focusable, but not being able to use hotkeys means I can't pause listening to websockets for example which ruins the experience when reading VNs as there can be a flow of previously seen text over the stream that pollutes the output in JL when I am just trying to read the log. This seems relatively easy to work around if JL starts a webserver to listen to hotkey input (a REST endpoint that takes in a simple JSON blob for example) that could then be invoked by autohotkey or some other software that don't require focus.

Something like the above might be nice to enable using hotkeys in general, but my primary want is to be able to pause getting text so having a button that can be clicked to invoke pausing / resuming reading text from sources without taking the focus away (I assume this is possible given that mouse click based lookup and mining is possible) would also be very helpful on its own.

Crash when opening preferences

Hello,
I just downloaded the latest release for the first time and it crashes when I'm trying to open the preferences (both x86 and x64 versions).

Here's the full stack trace

2022-10-03 16:06:01.968 +02:00 [ERR] System.ArgumentException: 'NaN' is not a valid value for property 'Value'.
   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at HandyControl.Controls.NumericUpDown.set_Value(Double value)
   at JL.Windows.ConfigManager.LoadPreferences(PreferencesWindow preferenceWindow) in D:\a\JL\JL\JL.Windows\ConfigManager.cs:line 741
   at JL.Windows.Utilities.WindowsUtils.ShowPreferencesWindow() in D:\a\JL\JL\JL.Windows\Utilities\WindowsUtils.cs:line 206
   at JL.Windows.GUI.MainWindow.ShowPreferences(Object sender, RoutedEventArgs e) in D:\a\JL\JL\JL.Windows\GUI\MainWindow.xaml.cs:line 572
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   at System.Windows.Controls.MenuItem.InvokeClickAfterRender(Object arg)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run()
   at JL.Windows.App.Main()```

Auto hide popup if cursor is not over it - not working as intended? (close this)

Auto hide popup if cursor is not over it - not working as intended?
image
I tried this setting toggled on and off and it doesn't change anything.

So, I was thinking that it should work kind of like Yomichan where you mouse over the word, then you can mouse over the definition so that you can copy it, use it for other things.

In my JL, I'm unable to mouse over the definitions themselves while looking up words, because once I move my mouse into the popup window, it immediately closes.

If I change the Lookup Mode to left-click/touch, or to Text Select mode, then I'm able to mouse over the popup window and scroll through, select text, etc.

edit
Never mind, I just read about Mining Mode. Got it.

Websocket support

Many textractor based tools have moved from clipboard polling to using a websocket. This method is more reliable and doesn't change your current text when you copy something else.

It may also be faster though I have not tested.

Server examples:

Client examples:

Would it be possible to consume text from a websocket server?

Detect Dialog Skip

would be nice if JL detects dialog skipping in some form and takes that into consideration for the provided stats.

  • playing a different route of a VN can completely mess up stats, which makes them only useful for a short amount of time.

Selected Dictionary Tabs should be remembered

the selected dictionary tab should be remembered instead of resetting to all dictionaries.

  • saves clicks. want to use/prioritize a certain dictionary (for example going mono for a session, or going with a dictionary that has example sentences and so on)

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.