Skip to content

Instantly share code, notes, and snippets.

@rafaelrinaldi
Created April 4, 2023 14:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafaelrinaldi/7a1fc5146546081c28fc4bbf0e706150 to your computer and use it in GitHub Desktop.
Save rafaelrinaldi/7a1fc5146546081c28fc4bbf0e706150 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# BASH fuzzyclock
# by Corey Mwamba
#
export TEXTDOMAINDIR="/usr/share/locale"
export TEXTDOMAIN=bash-fuzzy-clock
hr=($(date '+%_H'))
min=10#$(date '+%M')
nearly=$"nearly"
oclock=($"o'clock")
if [[ "${LANGUAGE:0:2}" != "" ]] ; then
lng="${LANGUAGE:0:2}"
elif [[ "${LANG:0:2}" != "" ]] ; then
lng="${LANG:0:2}"
fi
# To my knowledge, there is no natural way to say
# "just after four", for example, in brazilian portuguese
case $lng in
pt)
justaft=""
;;
*)
justaft=$"just after"
;;
esac
if [[ $((min % 5)) -gt 0 ]];then
if [[ $((min % 5)) -lt 3 ]]; then
adv=$justaft
else
adv=$nearly
fi
fi
case "$1" in
meri|m)
if [[ $hr -gt 0 && $hr -lt 12 ]]; then
echo $"morning"
elif [[ $hr -ge 12 && $hr -lt 18 ]]; then
echo $"afternoon"
elif [[ $hr -ge 18 && $hr -lt 21 ]]; then
echo $"evening"
else
echo $"night"
fi
;;
*)
if [[ $min -gt 27 && $min -lt 33 ]]; then
adj=$"half past"
case "$lng" in
de)
hr=$((hr + 1))
if [[ $hr -eq 24 ]]; then
hr=0
fi
esac
fi
case "$lng" in
pt)
if [[ $min -ge 37 ]]; then
hr=$((hr + 1))
if [[ $hr -eq 24 ]]; then
hr=0
fi
fi
;;
*)
if [[ $min -ge 33 ]]; then
hr=$((hr + 1))
if [[ $hr -eq 24 ]]; then
hr=0
fi
fi
esac
case $hr in
1|13)
th=$"one"
;;
2|14)
th=$"two"
;;
3|15)
th=$"three"
;;
4|16)
th=$"four"
;;
5|17)
th=$"five"
;;
6|18)
th=$"six"
;;
7|19)
th=$"seven"
;;
8|20)
th=$"eight"
;;
9|21)
th=$"nine"
;;
10|22)
th=$"ten"
;;
11|23)
th=$"eleven"
;;
0)
th=$"midnight"
;;
12)
th=$"midday"
esac
# French and Spanish use an hour declaration all the time
# Italian does not
# Most other languages treat one as a singular hour
#
# But this might change if other languages are added.
# I need to be able to control this better...
case "$lng" in
fr|es)
if [[ $hr -eq 1 || $hr -eq 13 ]]; then
manner=$"hour"
else
manner=$oclock
fi
;;
*)
if [[ $hr -ne 12 && $hr -ne 0 ]]; then
if [[ $min -gt 57 || $min -lt 3 ]]; then
manner=$oclock
fi
fi
esac
if [[ $min -ge 3 && $min -le 7 ]]; then
adj=$"five past"
fi
if [[ $min -gt 7 && $min -lt 13 ]]; then
adj=$"ten past"
fi
if [[ $min -ge 13 && $min -le 17 ]]; then
adj=$"quarter past"
fi
if [[ $min -gt 17 && $min -lt 23 ]]; then
adj=$"twenty past"
fi
if [[ $min -ge 23 && $min -le 27 ]]; then
adj=$"twenty-five past"
fi
if [[ $min -ge 33 && $min -le 37 ]]; then
adj=$"twenty-five to"
fi
if [[ $min -gt 37 && $min -lt 43 ]]; then
adj=$"twenty to"
fi
if [[ $min -ge 43 && $min -le 47 ]]; then
adj=$"quarter to"
fi
if [[ $min -gt 47 && $min -lt 53 ]]; then
adj=$"ten to"
fi
if [[ $min -ge 53 && $min -le 57 ]]; then
adj=$"five to"
fi
if [[ -z "$adv" && -z "$adj" ]]; then
printf $"$th $manner\n"
fi
if [[ -z "$adv" && -n "$adj" ]]; then
case $lng in
pt)
if [[ $min -lt 37 ]]; then
printf $"$adj $th $manner\n"
else
printf $"$adj $th\n"
fi
;;
*)
printf $"$adj $th $manner\n"
;;
esac
fi
if [[ -n "$adv" && -z "$adj" ]]; then
printf $"$adv $th $manner\n"
fi
if [[ -n "$adv" && -n "$adj" ]]; then
case $lng in
pt)
if [[ $min -lt 37 ]]; then
printf $"$adv $adj $th $manner\n"
else
printf $"$adv $adj $th\n"
fi
;;
*)
printf $"$adv $adj $th $manner\n"
;;
esac
fi
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment