Estimating reading time for second language reading
July 07, 2025
You probably have seen it on Medium, a neat little tag promising “4 min read”. It is a handy cue, unless you are reading that article in your second language (also called L2). The moment you switch to reading in Italian or Dutch or another language, those 4 minutes can stretch into 6 minutes and the usefulness of that estimate starts to crumble. And if you have only recently started learning a second language, that gap can grow even wider.
If you've ever felt like those reading time estimates don't apply to you, you're not the only one. Reading in a second language simply takes more time and that's something most platforms overlook.
LanguageLeveler is about to change that. In our upcoming release we will add estimates of reading time, to reflect the real pace of second language processing. This will give you a better sense of how long a book and even a single chapter, will take to complete.
Today's post explains how Medium's estimate works, why it tends to underestimate time for second-language learners and the research that backs up our adjustment. We also show how we are implementing a smarter algorithm in the LanguageLeveler app with the use of Python.
How Medium Calculates Reading Time
Medium actually has a simple but effective reading time calculation1.
Here’s how it works:
- Word count
Count the total number of words in the article or text - Select the words per minute
Medium states that the average adult reading speed is approximately 265 words per minute (WPM).
- Add extra time for potential images:
Medium adds a small buffer to the reading time for each image in the article.
Why? Because images naturally slow readers down. You might pause to interpret a chart, admire a photo, or simply take a moment to process what the image adds to the story.
Even brief pauses like these can add a few extra seconds per image and over the course of an article, that time adds up. - Calculate the estimated reading time :
Putting that all together it looks something like: 1200 words ÷ 265 ≈ 4.5 minutes + 20 seconds for images -> 5 minutes reading time
Medium rounds up to the nearest whole minute and displays the result beside the headline.
This rule-of-thumb works well for native readers processing text in their first language, where reading tends to be fast and intuitive. However, problems arise when people apply the same assumption to bilingual or foreign language readers. This group naturally reads more slowly and often needs extra time to understand unfamiliar vocabulary or sentence structures.
Why those estimates fall short for second language readers
Think back to the last time you tackled a difficult paragraph or text in your target language. You paused to decode unfamiliar syntax, checked an idiom, maybe reread a tricky sentence for nuance. These are all part of second language reading comprehension, and each of those small delays chips away at your speed.
Research on fluent bilinguals (Segalowitz, Poulsen, & Komoda, 1991)2 shows the slowdown is real: on average we read about 30 percent slower in a second language than in our native language. Medium's 265-words-per-minute baseline suddenly shrinks to roughly 185 WPM.
In other words, a “4-minute read” for a native speaker becomes six minutes for many second language learners. That gap matters: underestimating time can throw off your study plan and lower your motivation. To fix it, we need an adjustment rooted in data, not guesswork and that is exactly what we are building next.
Why accurate reading time matters for learners
Time budgeting is more than convenience. For many adult learners, opportunities to do some learning are during lunch breaks, commutes, or late-night moments. Over-promising a 10 minute read that takes 25 minutes risks derailing a tightly planned schedule and undermines motivation.
Realistic estimations help you choose texts that fit your schedule, finish practising more often and rack up small wins. All these things are critical ingredients for sustained progress! Accurate estimates also complement other LanguageLeveler features.
For example, when you know that a chapter will take 10 minutes, you can pair it with a five-minute flashcard review to build a 15 minute routine. Over weeks, that reliable timing adds up to hundreds of focused, frustration-free study sessions.
Designing a smarter reading-time estimation algorithm for LanguageLeveler
So what does implementing this idea look like? We're rolling it out in two clear stages, starting with a simple, research-backed adjustment.
Stage 1 – A universal 30% slowdown
As noted above, Segalowitz et al. measured reading speeds in highly fluent bilinguals and found they averaged roughly one-third slower than in their first language.
A chapter that Medium labels “5 min” would then appear as “7 min”
Based on these findings, we're starting with a straightforward adjustment:
Instead of using Medium's baseline of 265 words per minute, we'll apply a default rate of 185 WPM, a 30 percent reduction. Since the books in our app don't include images, we've chosen to skip the image-based slowdown. Currently, there is no need for us to account for visual pauses because our content is purely text.
Stage 2 – Manual Level-based reading speed
Research also shows the gap shrinks as proficiency rises: Shaw & McMillion's (2008)3 advanced Swedish readers needed about 25 percent extra time. Busby & Dahl (2021)4 found that near-native university students in a non-immersion environment read approximately 25% more slowly than native speakers, despite comparable comprehension.
Maluch & Sachse (2020)5 show that reading speed rises steeply from A1 to B1 but then plateaus; B1 and B2 learners read equally fast, while the extra proficiency at B2 shows up only in better comprehension.
That gives us a potential data-driven ladder:
- A1 & A2 ≈ 30 percent slower → 185 WPM
- B1 & B2 ≈ 25 percent slower → 199 WPM
- C1 ≈ 20 percent slower → 212 WPM
- C2 ≈ 15 percent slower → 225 WPM
We haven't scheduled a release date for Stage 2 yet, but we'll launch Stage 1 within the next month.
By implementing the 30 percent slowdown, we immediately address the biggest pain point for most learners. Adding stage 2 later, gives us time to gather feedback on how learners respond to the initial slowdown factor. We will then re-evaluate if we can start on implementing Stage 2.

Formula used to estimate second-language reading time in the LanguageLeveler app.
Technical implementation
Python code that calculates the words per minute:
def calculate_read_time(
word_count: int,
l2_words_per_minute: float,
) -> int:
"""Calculates the estimated reading time rounded up to whole minutes.
Args:
word_count: Total number of words in the text.
l2_words_per_minute: Reading speed in the second language in words per minute.
Returns:
The estimated reading time in whole minutes.
Raises:
ValueError: If `word_count` is negative or `l2_words_per_minute` is not positive.
"""
if word_count < 0:
raise ValueError("word_count cannot be negative.")
if l2_words_per_minute <= 0:
raise ValueError("l2_words_per_minute must be positive.")
return math.ceil(word_count / l2_words_per_minute)
def calculate_words_per_minute(
native_words_per_minute: int = 265,
slowdown_factor: float = 0.7,
) -> float:
"""Calculates reading speed in the second language (L2) from the average native reading speed.
Args:
native_words_per_minute: Reading speed in words per minute in the native language.
slowdown_factor: The proportion of native speed retained when reading
in the second language (L2). Must be between 0 (exclusive)
and 1 (inclusive). For example, 0.7 implies a 30% reduction
in reading speed.
Returns:
The calculated reading speed in words per minute for the second language.
Raises:
ValueError: If `native_words_per_minute` is not positive, or if `slowdown_factor`
is not between 0 (exclusive) and 1 (inclusive).
"""
if native_words_per_minute <= 0:
raise ValueError("native_words_per_minute must be positive.")
if not 0 < slowdown_factor <= 1:
raise ValueError("slowdown_factor must be between 0 (exclusive) and 1 (inclusive).")
return native_words_per_minute * slowdown_factor
def get_estimated_reading_time(
word_count: int,
slowdown_factor: float = 0.7,
native_words_per_minute: int = 265,
) -> int:
"""Estimates reading time in minutes for texts read in a second language.
Args:
word_count (int): Total number of words in the text.
slowdown_factor (float, optional): Proportion of native reading speed retained in L2.
Defaults to 0.7.
native_words_per_minute (int, optional): Native reading speed. Defaults to 300.
Returns:
int: Estimated reading time in whole minutes.
Examples:
>>> get_estimated_reading_time(450)
3
>>> get_estimated_reading_time(450, slowdown_factor=1.0)
2
"""
l2_words_per_minute = calculate_words_per_minute(native_words_per_minute, slowdown_factor)
return calculate_read_time(word_count, l2_words_per_minute)
You can help shape what comes next
We base the 30 percent slowdown in this first release on research showing that even fluent bilinguals read more slowly in their second language. But just as important is something less scientific: our own experience.
As someone who reads a lot in a second language, I've often found that native-targeted time estimates (like Medium's) just don't feel right. Reading an article labeled “4 minutes” might actually take 6 minutes once you factor in occasional re-reading, unfamiliar structures, or vocabulary checks. That small mismatch becomes frustrating, especially when time is tight.
That's what started the idea of this feature.
So is 30 percent the perfect slowdown for everyone? Of course not. Some people will read faster, others slower, depending on their level, the topic, and their experience with the language.
That's why we're treating this first release as a starting point, not a final solution.
We're not yet tracking reading behavior in the app (privacy and simplicity come first), so we can't gather real usage data. But what we can do is invite feedback from you.
If you're a user of LanguageLeveler:
- Try out the updated reading-time feature once it launches.
- Pay attention to whether the time estimates feel accurate.
- If they feel too fast, too slow, or just right, let us know.
Your feedback will help us improve. Our goal is to eventually let you pick your CEFR level yourself. Even adapting automatically based on how you interact with texts over time is a possibility.
But before we get there, we need this first version out in the wild. That's where you come in. This is research-backed, yes, but it's also an experiment. And like any good experiment, it works best when you're part of it.
Conclusion
Accurate reading-time estimates allow learners to trust the suggested reading duration and dedicate more time to focused learning. By adjusting Medium's formula with a research-backed slowdown factor, LanguageLeveler gives learners estimates they can actually rely on.
In the future, level-specific baselines will refine the estimate so it evolves with your growing fluency.
The first version ships in our next update. Update the app, open a book, and know exactly how many minutes you need before you start.
Try LanguageLeveler today and accelerate your journey to advanced mastery.
References
- Medium. (n.d.). Read time. https://help.medium.com/hc/en-us/articles/214991667-Read-time
- Segalowitz, N., Poulsen, C., & Komoda, M. (1991). Lower level components of reading skill in higher level bilinguals: Implications for reading instruction. AILA Review, 8(1), 15–30.
- Shaw, P., & McMillion, A. (2008). The balance of speed and accuracy in advanced L2 reading comprehension. Nordic Journal of English Studies, 7(3), 123–143.
- Busby, N. L., & Dahl, A. (2021). Reading rate of academic English texts: Comparing L1 and advanced L2 users in different language environments. Nordic Journal of English Studies, 20(1), 36–61.
- Maluch, J. T., & Sachse, K. A. (2020). Reading in developing L2 learners: The inter-related factors of speed, comprehension and efficiency across proficiency levels. TESL-EJ, 24(1).