I take a job doing it.
I started out with basic and machine language when I was young.
Took a consulting Excel data input job and hated the tedium so I wrote some macros. They were so impressed with the macros that they started paying me 6x more to develop programs for them.
Just after that someone wanted a database program for tracking employee hours--I grabbed a copy of dBase and was able to demo something within a week, fully operational and debugged in a month or so.
Found a job in C--little company willing to take a chance on someone who didn't know the language. Learned it on the fly. Did well enough where I was hired by the customer of a product I had worked on. Once the product was completed, I proposed a simpler version written in VB, they didn't like the "Basic" idea but were willing to let me try (It involved a LOT of screen scraping and string processing, C's worst nightmare).
Learned VB as I coded that. Became a very successful product, and I moved into group where I was able to move the direction of the group towards Java.
More recently I took a pretty big pay cut to work at a company doing web programming so I could more deeply understand the web development world, Ruby on Rails and Agile. (didn't take, by the way, but I'm glad I did it)
Anyway, my point is that to "Learn" a language without using it on a job is mostly pointless. Also, to work where you can just make the most money isn't the "Goal" of life.
Take jobs that make you happy, give you skills and let you do what you want to do. If you don't like programming, become a ski instructor. If you like programming, program!
edit: and for a more direct answer, I find debugging existing code or trying to add a feature to be the best ways to learn a new language. You have example code in front of you and you can look up references on the web. I may pick up a book as a reference if the language doesn't have a tool as powerful as Javadocs, or to teach more advanced techniques at some point.