If you exclude application/, then everything under it will always be excluded (even if some later negative exclusion pattern (“unignore”) might match something under application/).
To do what you want, you have to “unignore” every parent directory of anything that you want to “unignore”. Usually you end up writing rules for this situation in pairs: ignore everything in a directory, but not some certain subdirectory.
# you can skip this first one if it is not already excluded by prior patterns
!application/
application/*
!application/language/
application/language/*
!application/language/gr/
Note
The trailing /* is significant:
- The pattern
dir/excludes a directory nameddirand (implicitly) everything under it.
Withdir/, Git will never look at anything underdir, and thus will never apply any of the “un-exclude” patterns to anything underdir. - The pattern
dir/*says nothing aboutdiritself; it just excludes everything underdir.
Withdir/*, Git will process the direct contents ofdir, giving other patterns a chance to “un-exclude” some bit of the content (!dir/sub/).